synchronized既保证原子性,又保证内存可见性,是一种线程同步的方式,是锁机制的一种java实现。synchronized的实现基于JVM底层,JVM是基于monitor实现的,而monitor的实现依赖于操作系统的互斥实现。

语义

synchronized语义是同步,但同步有两层含义:

  1. 互斥,即锁的特点。同一时间只能有一个线程持有监视器,因此一旦线程进入监视器保护的代码块(即临界区),其他线程是不允许监视器保护的代码块,直到前一个线程退出代码块。互斥阻止了其他线程看到对象不一致的状态,与原子性有相同的语义。

  2. 可见。synchronized保证进入同步代码块的线程,都可以看到由同一个锁保护的之前所有的修改效果。原因是:在释放监视器时(即退出同步代码块),会将工作内存中未映射到主内存的工作拷贝,强制刷新回主内容。在获取监视器是(即进入同步代码块时),监视器会使本地内存失效,强制从主内存拷贝到工作内存。

互斥保证在线程退出前,所有对象状态变更都对其他线程不可见;可见保证在线程进入同步代码块时,可以看到上一个线程对对象状态变更的最终状态。

线程安全与同步

网友评论