Java中的同步方法

一、Synchronized

Synchronized是JAVA中的关键字,是语言层面的互斥锁。它可以修饰以下对象:

  1. 修饰代码块,被修饰的代码块称为同步语句块,其作用范围即大括号{}括起来的代码,作用的对象是调用这个代码块的对象。保证最多只有一个线程能够允许该代码块。
  2. 修饰一个方法,被称为同步方法,作用范围为整个方法,作用的对象是调用这个代码块的对象。
  3. 修饰一个类,作用范围是整个类。作用的对象是该类所有实例。

二、ReentrantLock

ReentrantLock是API层面的互斥同步锁(悲观锁),该使用方法表现为各个线程抢占锁的形式。按照公平与否可以分为公平锁、非公平锁。

公平锁表现为谁等待的时间长,谁就先获取锁,顾名思义非公平锁则是一个随机获取过程,谁运气好,CPU时间寻到哪个线程哪个线程就能够获取锁。

最后都得释放锁。要注意造成死锁的情况。

三、原子类(CAS)

特点:高性能、(较于互斥同步锁)
缺点:只能够同步一个值。

  1. 关键字:Volaitile.作用保证变量的内存可见性 、禁止指令重排序。关于内存可见性在JAVA中的含义为:由于共享变量储存于主内存中,子线程中的本地变量所改变之后,无法及时更新到主内存从而出现线程使用共享变量的值时,该值不是最新的。使用Volatile关键字或者加锁既可以解决可见性问题。(注:为什么加锁后就保证了变量的内存可见性了? 因为当一个线程进入 synchronizer 代码块后,线程获取到锁,会清空本地内存,然后从主内存中拷贝共享变量的最新值到本地内存作为副本,执行代码,又将修改后的副本值刷新到主内存中,最后线程释放锁。
  2. 在编译器中,有时候会对于代码的一些先后顺序所进行改变。使用Volaitile关键字后则,禁止指令重排序。