可见性和原子性

首先分析下什么是可见性,只进行抽象分析

原子性

原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。


可见性

可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。

  • volatile 本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,

  • synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.

那么什么时候用可见性?

当多线程并不直接进行原子性操作的时候,可以用 volatile 修饰,这样可以保证每个线程读取的都是最新的

什么时候用原子性?

当涉及到多个线程对同一个数据进行操作的时候,为了保证在同一刻只有一个操作,就用 synchronized 修饰加锁🔐

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,468评论 11 349
  • volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在...
    抓兔子的猫阅读 2,767评论 4 5
  • volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性,但是关于volatile的使用仍然要小心...
    Ruheng阅读 13,377评论 40 134
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,140评论 0 11
  • 十年前的一个早上,去农贸市场采购,兜转到家禽档口,买点鸡肉吧,看着女老板娴熟的动作,想必主顾挺多。 忽然,余光中好...
    方圆之旅阅读 1,495评论 0 0