1、原子性

(1)原子是构成物质的基本单位(当然电子等暂且不论),所以原子的意思代表着——“不可分”;

(2)原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。

2、非原子性

(1)也就是整个过程中会出现线程调度器中断操作的现象,例如:

类似"a += b"这样的操作不具有原子性,在某些JVM中"a += b"可能要经过这样三个步骤:

(1)取出a和b

(2)计算a+b

(3)将计算结果写入内存

如果有两个线程t1,t2在进行这样的操作。t1在第二步做完之后还没来得及把数据写回内存就被线程调度器中断了,于是t2开始执行,t2执行完毕后t1又把没有完成的第三步做完。这个时候就出现了错误,相当于t2的计算结果被无视掉了。所以上面的买碘片例子在同步add方法之前,实际结果总是小于预期结果的,因为很多操作都被无视掉了。

类似的,像"a++"这样的操作也都不具有原子性。所以在多线程的环境下一定要记得进行同步操作。

3、可见性

可见性volatile修饰词,可以应对多线程同时访问修改同一变量,由于相互的不可见性所带来的不可预期的结果,存在二义性的现象,出现的。

多线程变量不可见:当一个线程对一变量a修改后,还没有来得及将修改后的a值回写到主存,而被线程调度器中断操作(或收回时间片),然后让另一线程进行对a变量的访问修改,这时候,后来的线程并不知道a值已经修改过,它使用的仍旧是修改之前的a值,这样修改后的a值就被另一线程覆盖掉了。

多线程变量可见:被volatile修饰的成员变量在每次被线程访问时,都强迫从内存中重读该成员变量的值;而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存,这样在任何时刻两个不同线程总是看到某一成员变量的同一个值,这就是保证了可见性。

volatile使用场景:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
注意:

如果给一个变量加上volatile修饰符,就相当于:每一个线程中一旦这个值发生了变化就马上刷新回主存,使得各个线程取出的值相同。编译器不要对这个变量的读、写操作做优化。但是值得注意的是,除了对long和double的简单操作之外,volatile并不能提供原子性。所以,就算你将一个变量修饰为volatile,但是对这个变量的操作并不是原子的,在并发环境下,还是不能避免错误的发生!

4、synchronized

synchronized为一段操作或内存进行加锁,它具有互斥性。当线程要操作被synchronized修饰的内存或操作时,必须首先获得锁才能进行后续操作;但是在同一时刻只能有一个线程获得相同的一把锁(对象监视器),所以它只允许一个线程进行操作。

最新文章

  1. .NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用
  2. 【Win10开发】关于AutoSuggestBox
  3. <<< html图片背景平铺
  4. 《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了
  5. UCloud内核热补丁技术揭秘
  6. Android 添加系统服务
  7. 第十三章、学习 Shell Scripts 条件判断式
  8. 关于用jQuery知识来实现优酷首页轮播图!
  9. Android Activity 启动模式详解
  10. HTML5的Websocket(理论篇 I)
  11. ASP.NET Core 异常处理与日志记录
  12. 页面的input唤醒软键盘再收起后,页面会出现软键盘高度的空白背景
  13. Spring源码学习-容器BeanFactory(五) Bean的创建-探寻Bean的新生之路
  14. mui-选项卡+scroll滚动
  15. Linux之特殊符号与正则表达式
  16. 华为交换机-SNMP配置
  17. 使用 cron 定时任务实现 war 自动化发布
  18. [R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。
  19. FPGA中的时序分析(五)
  20. python中的sort方法

热门文章

  1. javascript时间处理
  2. 一个HttpClient使用Windows认证请求WCF服务的例子
  3. linux系统(rpm与deb环境),JAVA JDK的配置
  4. Android 性能优化之内存泄漏检测以及内存优化(中)
  5. Python IO内核交互了解
  6. openvpn 初步使用
  7. Nginx配置SSL证书实现https访问「浏览器未认证」
  8. [c/c++] programming之路(21)、字符串(二)
  9. 解决多个div左浮动后不换行问题
  10. Android添加百分比布局库时显示Failed to resolve: com.android.support.percent:问题