1、synchronized(object)
若是object没有被加锁,则获取object的锁;若是object已经被加锁则等待object的锁被释放。安全
2、须要加锁的情景
多线程共享同一资源会引发线程安全的状况下,才须要加同步锁。不一样的对象在不一样的线程中时(如:A类的A1对象,和A类的A2对象,分别在线程a1和a2中),是不存在线程安全问题的。多线程
3、synchronized的几种用法或者是形式
大体能够分为两种状况异步
- synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)
- synchronized修饰静态方法以及同步代码块的synchronized (类.class)
4、理解 synchronized修饰非静态方法 和 synchronized(this)
用synchronized修饰方法和用synchronized(this)获取的是该对象的锁this
- synchronized同步方法
- 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
- 同一时间只有一个线程执行synchronized同步方法中的代码。
- synchronized(this)同步代码块
- 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
- 同一时间只有一个线程执行synchronized同步方法中的代码。
- synchronized(非this对象)同步代码块
- 好处: 若是在一个类中有不少个synchronized方法,这是虽然能够实现同步,可是会受到阻塞。影响效率。可是若是使用了同步代码块的非this锁,则该synchronized(非this)代码块和程序中的同步方法是异步的。不和其余线程争取this锁,能够提升运行效率。
- 使用synchronized(任意自定义对象)进行同步操做,对象监视器必须是同一个对象。若是不是同一个,运行就是异步执行了。
5、理解synchronized修饰静态方法 和 synchronized (类.class)
- 一个类只有一个类对象,其实类锁也是类的对象锁,静态的方法或代码块是属于类(类对象)的,因此synchronized修饰静态资源须要获取类锁。
- 修饰静态方法 和 修饰静态方法 内的代码快 与 (四) 相同
- 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对象