https://blog.csdn.net/ustcyy91/article/details/78752149
对当前对象加锁(对象锁对于不同的对象实例没有锁的约束)实例对象被lock,则该实例对象的所有同步方法全被lock;synchronized methods(){} 与synchronized(this){}之间没有什么区别。只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
synchronized(this) {}
public void synchronized save();
对当前类加锁(多线程中,不同的对象,类锁具有约束性)若类对象被lock,则类对象的所有同步方法全被lock
A.class当前类
synchronized(A.class) {}
public void static synchronized save();
在上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,不会起到同步作用。
private Object lock = new Object();
synchronized(lock) {}
不同的类使用的就是同一个object对象,需要的锁也是同一个锁,就可以达到互斥的效果了。
private static Object lock = new Object();
synchronized(lock) {}
https://www.cnblogs.com/lixuwu/p/5676143.html