Synchronized

以下内容整理自互联网,仅用于个人学习


采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。

几点说明:

  • 对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性
  • 在静态方法上的锁,和实例方法上的锁,默认不是同样的,如果要同步,则需要制定两把锁一样。
  • 关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同。比如 new A().x() 和 new A().x(),对象不同,锁不同,如果A是单例的,就能互斥。
  • 静态方法加锁,能和所有其他静态方法加锁的进行互斥
  • 静态方法加锁,和xx.class锁效果一样,直接属于类的

同步代码块

把代码段声明为synchronized,通过这种方法可以保证并发线程在任一时刻只有一个线程可以进入修改共享资源的代码区。

同步方法

使用关键字synchronized修饰的方法。
synchronized方法控制对类的成员变量的访问

  • 每个类实例对应一把锁。
  • 每个synchronized方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞。
  • 方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
  • 所有声明为synchronized的成员函数中至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。

你可能感兴趣的:(Synchronized)