我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

并发编程三要素是什么

本篇内容主要讲解“并发编程三要素是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“并发编程三要素是什么”吧!

十年的长安网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整长安建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“长安网站设计”,“长安网站推广”以来,每个客户项目都认真落实执行。

并发编程三要素
  1. **原子性:**一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

  2. 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

  3. 可见性:一个县城对共享变量的修改,另一个线程能够立刻看到。

一、原子性

线程切换会带来原子性的问题

int i = 1; // 原子操作
i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存。

虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为“复合操作”。

我们可以用synchronized 或 Lock 来把这个复合操作“变成”原子操作。

例子:

//使用synchronized
private synchronized void increase(){
   i++;
 }
//使用Lock
private int i = 0;
 Lock mLock = new ReentrantLock();
 
 private void increase() {
   mLock.lock();
   try {
     i++;
   } finally{
     mLock.unlock();
   }
 }

这样我们就可以把这个一个方法看做一个整体,一个不可分割的整体。

除此之前,我们还可以用java.util.concurrent.atomic里的原子变量类,可以确保所有对计数器状态访问的操作都是原子的。

例子:

  AtomicInteger mAtomicInteger = new AtomicInteger(0);  
  private void increase(){
    mAtomicInteger.incrementAndGet();
  }
二、可见性

缓存导致可见性问题

并发编程三要素是什么

int v = 0;
// 线程 A 执行
v++; 
// 线程 B 执行
System.out.print("v=" + v);

即使是在执行完线程里的 i++ 后再执行线程 B,线程 B 的输入结果也会有 2 个种情况,一个是 0 和1。

因为 i++ 在线程 A(CPU-1)中做完了运算,并没有立刻更新到主内存当中,而线程B(CPU-2)就去主内存当中读取并打印,此时打印的就是 0。

禁用缓存能保证可见性,volatile关键字可以禁用缓存

synchronized和Lock能够保证可见性。

三、有序性

导致有序性的原因是编译优化

我们都知道处理器为了拥有更好的运算效率,会自动优化、排序执行我们写的代码,但会确保执行结果不变。

例子:

int a = 0; // 语句 1
int b = 0; // 语句 2
i++; // 语句 3
b++; // 语句 4

这一段代码的执行顺序很有可能不是按上面的 1、2、3、4 来依次执行,因为 1 和 2 没有数据依赖,3 和 4 没有数据依赖, 2、1、4、3 这样来执行可以吗?完全没问题,处理器会自动帮我们排序。

在单线程看来并没有什么问题,但在多线程则很容易出现问题。

再来个例子:

// 线程 1
init();
inited = true;
 
// 线程 2
while(inited){
    work();
}

init(); 与 inited = true; 并没有数据的依赖,在单线程看来,如果把两句的代码调换好像也不会出现问题。

但此时处于一个多线程的环境,而处理器真的把这两句代码重新排序,那问题就出现了,若线程 1 先执行 inited = true; 此时,init() 并没有执行,线程 2 就已经开始调用 work() 方法,此时很可能造成一些奔溃或其他 BUG 的出现。

synchronized和Lock能确保原子性,能让多线程执行代码的时候依次按顺序执行,自然就具有有序性。

而volatile关键字也可以解决这个问题,volatile 关键字可以保证有序性,让处理器不会把这行代码进行优化排序。

到此,相信大家对“并发编程三要素是什么”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


新闻名称:并发编程三要素是什么
链接URL:http://mswzjz.cn/article/jseogs.html

其他资讯