加载中 ...

Java多线程三核

2019-07-10 16:46:47 来源:沈阳小程序开发 作者:沈阳软件开发

原子性

Java的原子性类似于数据库事物的原子性,并且所有操作在一次操作中成功或失败。

JMM只保证基本的原子性,但像i ++这样的操作似乎是原子操作,实际上涉及:

获得i的价值。

自我提高。

将它分配给我。

这三个步骤,所以要实现像i ++这样的原子操作,你需要使用synchronize或lock来锁定。

如果可以使用原子类(如AtomicInteger)实现基类的自增量操作(主要使用CPU级CAS指令完成)。

最常用的方法是: incrementAndGet(),它以原子方式递增。源代码如下:

Public final long incrementAndGet(){for(;){long current=get(); long next=当前+ 1; if(compareAndSet(current,next))返回next; }}

第一种是获取当前值,然后增加+1。然后是compareAndSet()的核心用于原子更新。

public final boolean compareAndSet(long expect,long update){return unsafe.compareAndSwapLong(this,valueOffset,expect,update); }

逻辑是确定当前值是否已更新,是否等于当前值,如果它是相等的,则表示它尚未更新,然后将当前值更新为next。如果它不相等,则返回false并进入循环直到更新成功。

还有一个get()方法也很关键,返回当前值,并使用volatile关键字修饰当前值以确保内存可见性。

私有volatile int值;

可见性

在现代计算机中,由于CPU直接从主存储器读取数据,因此缓存CPU缓存。首先将主存储器中的数据读入高速缓存。线程修改数据后,首先将其更新到缓存。将更新到主内存。如果此时数据尚未更新到主存储器,则其他线程正在修改之前读取数据。

顺序性

以下代码为:

Int a=100; //1int b=200; //2int c=a + b; //3

在正常条件下的执行顺序应该是1>>>> 3。但是,有时JVM可以执行指令重新排序以提高整体效率。执行顺序可以是2>>>> 3。但是,JVM不能重新排序,并且可以重新排列最终结果和代码序列执行结果。

在单个线程中重新排列没有问题,但是在多线程中存在数据不一致的问题。

在Java中,您可以使用volatile来确保顺序,同步和锁定也可以保证顺序,就像确保原子性的方式一样,只能在同一段时间内通过一个线程访问。

除了通过volatile关键字的显式保证顺序之外,JVM还隐式地保证了通过before-before原则进行排序。

其中一个是volatile关键字。 volatile关键字的写操作肯定在读操作之前,这意味着读取的值肯定是最新的。

挥发性应用

用于双重检查锁的单箱模式

您可以使用volatile

实现软件开发

ad.jpg

用于双重检查锁的单例模式:

公共类Singleton {private static volatile Singleton singleton; private Singleton(){} public static Singleton getInstance(){if(singleton==null){synchronize(Singleton.class){if(singleton==null){singleton=new Singleton (); } return} singleton;}}

这里的volatile关键字主要是为了防止指令重新排序。如果你不使用volatile,singleton=new Singleton();这段代码实际上分为三个步骤:

分配内存空间。 (1)

初始化对象。 (2)

将单例对象指向分配的内存地址。 (3)

添加volatile是为了使上述三步操作顺序,反之亦然。第二步可能在第三步之前执行。线程获得的单例对象可能未初始化,因此报告错误。

控制停止线程的标记

private volatile boolean flag; private void run(){new Thread(new Runnable(){if(flag){doSomeThing();}});} private void stop(){flag=false;}

如果不使用volatile来修改标志,则有可能其中一个线程调用了stop()方法来修改flag的值,并且不会立即刷新到主内存,导致循环不会立即停止。

这里的主要用途是volatile的内存可见性。

总结:

volatile关键字只能保证可见性,顺序,并且不能保证原子性。

汇海 Technology是领先的综合性软件和信息服务公司,为客户提供从软件开发到营销和推广的互联网解决方案,旨在成为业界领先的全链信息技术服务提供商。公司与中国移动,平安银行,南方数字,北大青鸟,西门子等行业巨头进行了全面深入的战略合作。深入涉足汽车,金融,电子商务,农业,教育等重点行业,不断开拓全国市场,为客户提供全方位的连锁服务。优质,高效,技术服务,综合优势和行业特色。武汉哪家公司做网站?武汉哪家公司做网站?哪家公司是网站?武汉着名的网站建设公司?武汉的武汉网站生产企业有哪些?武汉网站外包?武汉有哪些可靠的软件开发公司?武汉有哪些更好的app开发,微信开发和系统开发公司?如果您有这样的需求,请联系汇海技术,财富热线:027-86633307,我们将以专业的服务态度做到每一个需要,这是我们的目标,使每一个需要到极致!

“沈阳软件公司”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与

我们联系删除或处理,客服QQ:55506560,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同

其观点或证实其内容的真实性。