JavaWeb笔记06:Java中的加锁机制(同步机制)——synchronized

synchronized

用法:
1 作为方法修饰符,写在定义的方法之前。
1)同步方法:synchronized修饰普通方法,锁的是this引用指向的对象

synchronized void method(){  
}

2)同步静态方法:synchronized修饰静态方法,锁的是 类名.class引用指向的对象(class本身也有一个对象,可以通过类名.class引用找到这个对象(反射用法))

synchronized static void method(){
}

2 作为代码块
1)同步代码块:锁的是引用指向的对象(对象里面的锁)

void method(){
 Object a = new Object();
 synchronized(一个引用){  
}
}

3 等价关系
1)修饰静态方法等价于静态代码块

class A{
synchronized static void method(){}
}
class A{
 static void method(){
 	synchronized(A.class){}
 }
 }

2)修饰普通方法等价于普通代码块

synchronized void function{} 
 void function(){
	 synchronized(this){};
 }

对象: 对象是对一块堆内存区域的抽象, 对象中保存了各种属性。

注意:

  • JVM实现时,每个对象都带有一把锁,每个对象都可以作为一把锁 (Monitor Lock)——(监视器 /同步锁 /监视器锁)。
    例如:Object o = new Object(); //o这个引用指向的对象中,拥有一把锁
  • 线程抢锁失败后,必须让出CPU,并再也没有资格抢锁,状态从Runnable变成Blocked(专为synchronized抢锁失败设计的状态), 从就绪队列移到阻塞队列。
  • 当线程执行unlock时,会把锁释放掉,并把当时因抢锁失败的线程从Blocked改为Runnable, 使其重新拥有了抢锁的资格,从阻塞队列移到就绪队列中。
  • synchronized需要用到对象中的锁,所以也是一个解引用的过程
Object a = null; 
 synchronized(a){
   //肯定会抛NullPointerException 
   }
发布了54 篇原创文章 · 获赞 6 · 访问量 4788

猜你喜欢

转载自blog.csdn.net/glpghz/article/details/104904053