一、synchronized(object)
如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。
二、需要加锁的情景
多线程共享同一资源会引起线程安全的情况下,才需要加同步锁。不同的对象在不同的线程中时(如:A类的A1对象,和A类的A2对象,分别在线程a1和a2中),是不存在线程安全问题的。
三、synchronized的几种用法或者是形式
大致可以分为两种情况
- synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)
- synchronized修饰静态方法以及同步代码块的synchronized (类.class)
四、理解 synchronized修饰非静态方法 和 synchronized(this)
用synchronized修饰方法和用synchronized(this)获取的是该对象的锁
- synchronized同步方法
- 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
- 同一时间只有一个线程执行synchronized同步方法中的代码。
- synchronized(this)同步代码块
- 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
- 同一时间只有一个线程执行synchronized同步方法中的代码。
- synchronized(非this对象)同步代码块
- 好处: 如果在一个类中有很多个synchronized方法,这是虽然可以实现同步,但是会受到阻塞。影响效率。但是如果使用了同步代码块的非this锁,则该synchronized(非this)代码块和程序中的同步方法是异步的。不和其他线程争取this锁,可以提高运行效率。
- 使用synchronized(任意自定义对象)进行同步操作,对象监视器必须是同一个对象。如果不是同一个,运行就是异步执行了。
五、理解synchronized修饰静态方法 和 synchronized (类.class)
- 一个类只有一个类对象,其实类锁也是类的对象锁,静态的方法或代码块是属于类(类对象)的,所以synchronized修饰静态资源需要获取类锁。
- 修饰静态方法 和 修饰静态方法 内的代码快 与 (四) 相同
- 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
来源:oschina
链接:https://my.oschina.net/u/2928472/blog/2120774