java锁的到底是锁的什么??

锁住的内容

锁代码块

对多个线程使用的多个此类A的代码加锁,即使多个线程多个对象也 会只有一个线程进入到此代码块,与对象个数,线程个数无关。

实现方式

(1)类代码块  public  void a(){ synchronized(A.class){} }

(2)静态lock对象 static  Lock lock=new ReetrantLock();

(3)静态方法  public synchronized  static void xx(){}

锁对象

对多个线程使用的同一个类A对象加锁,与线程个数无关,多个线程中必须使用同一个类A对象,才会同步线程。

实现方式

(1)对象代码块 public  void a() synchronized(this){} }

(2)非静态方法 public synchronized  void xx(){}

(3) 非静态lock对象 Lock lock=new ReetrantLock()

Synchronized 锁

1、synchronized加在非静态方法前和synchronized(this)都是锁住了这个类的对象,如果多线程访问,对象不同,就锁不住,对象固定是一个,就可锁住。

2、synchronized(类名.class)以及加在静态方法前,是锁住了代码块,不管多线程访问的时候对象是不是同一个,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步,缩小锁的粒度。

lock锁

前面加static如 static Lock lock = new ReentrantLock(); 是对代码块加锁,若不加static是对对象加锁。

java锁的到底是锁的什么??_第1张图片

你可能感兴趣的:(java,线程有关)