java synchronized实现可见性

来源:互联网 发布:手机淘宝怎么秒杀东西 编辑:程序博客网 时间:2024/05/21 10:54

      synchronized大家知道的最多的是其在java语言层面实现了同步锁,但是很少会注意到,synchronized同volatile,也实现了线程间的可见性。

      JMM关于synchronized的两条规定:

      1. 线程解锁时,必须将其工作内存中的共享变量的值刷新到主内存

      2. 线程加锁时,必须清空其工作内存中共享变量的值,从而使用共享变量时,需要从主内存中拷贝共享变量

      因此,线程执行synchronized代码段时,步骤如下:

      1. 获取互斥锁

      2. 清空线程的工作内存

      3. 从主内存拷贝共享变量到工作内存

      4. 执行代码

      5. 将共享变量刷新到主内存

      6. 释放锁

      另外,volatile与synchronized的区别如下:

      1. volatile是不需要加锁的,因此比synchronized更加轻量级,不会阻塞线程

      2. 从内存可见性角度来看,volatile的读相当于加锁(清空工作内存,从主内存中拷贝共享变量),volatile的写相当于解锁(将线程工作内存中的共享变量刷新到主内存)

      3. volatile只是保证可见性,不保证原子性,而synchronized既保证可见性又保证原子性

 

0 0