synchronized 之 对象锁 和 类锁

本小妞迷上赌 提交于 2019-12-10 02:50:27

一、synchronized(object)

如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。

二、需要加锁的情景

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

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

大致可以分为两种情况

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

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

用synchronized修饰方法和用synchronized(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(任意自定义对象)进行同步操作,对象监视器必须是同一个对象。如果不是同一个,运行就是异步执行了。

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

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

六、参考

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!