synchronized 之 对象锁 和 类锁

1、synchronized(object)

若是object没有被加锁,则获取object的锁;若是object已经被加锁则等待object的锁被释放。安全

2、须要加锁的情景

多线程共享同一资源会引发线程安全的状况下,才须要加同步锁。不一样的对象在不一样的线程中时(如:A类的A1对象,和A类的A2对象,分别在线程a1和a2中),是不存在线程安全问题的。多线程

3、synchronized的几种用法或者是形式

大体能够分为两种状况异步

  1. synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)
  2. synchronized修饰静态方法以及同步代码块的synchronized (类.class)

4、理解 synchronized修饰非静态方法 和 synchronized(this)

用synchronized修饰方法和用synchronized(this)获取的是该对象的锁this

  1. synchronized同步方法
    1. 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
    2. 同一时间只有一个线程执行synchronized同步方法中的代码。
  2. synchronized(this)同步代码块
    1. 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
    2. 同一时间只有一个线程执行synchronized同步方法中的代码。
  3. synchronized(非this对象)同步代码块
    1. 好处: 若是在一个类中有不少个synchronized方法,这是虽然能够实现同步,可是会受到阻塞。影响效率。可是若是使用了同步代码块的非this锁,则该synchronized(非this)代码块和程序中的同步方法是异步的。不和其余线程争取this锁,能够提升运行效率。
    2. 使用synchronized(任意自定义对象)进行同步操做,对象监视器必须是同一个对象。若是不是同一个,运行就是异步执行了。

5、理解synchronized修饰静态方法 和 synchronized (类.class)

  1. 一个类只有一个类对象,其实类锁也是类的对象锁,静态的方法或代码块是属于类(类对象)的,因此synchronized修饰静态资源须要获取类锁。
  2. 修饰静态方法 和 修饰静态方法 内的代码快 与 (四) 相同
  3. synchronized (类.class)修饰非静态代码快,全部类的实例包括类对象自己(类.class)都会被堵塞。

6、参考

https://blog.csdn.net/u013142781/article/details/51697672.net

https://blog.csdn.net/luckey_zh/article/details/53815694线程

https://blog.csdn.net/mrsyf/article/details/78206412对象

相关文章
相关标签/搜索