-
修饰 实例方法 ,这种情况不同的对象之间是可以并发的。等于给对象加锁
-
修饰 静态方法 ,这种情况下不同的对象是不能并发的,但是不同的类之间可以进行并发。等于给类加锁
-
修饰 多个方法 ,这多个方法在同一时刻只能有一个方法被执行,而且只能有一个线程能够执行。等于给对象加锁
-
修饰 实例方法代码块,同一个时刻只能有一个线程执行代码块。等于给对象加锁
-
修饰 静态方法代码块,同一个时刻只能有一个线程执行这个代码块,而且不同的对象之间不能够进行并发。等于给类加锁
-
应该用什么对象作为锁对象,建议不要使用字符串和基本类型的包装类作为锁对象,因为Java对这些进行优化,很可能多个对象使用的是同一个锁对象,这会大大降低程序的并发度。
-
程序在进入和离开Synchronized代码块的时候都会将线程的工作内存刷新到内存当中,以保证数据的可见性,这一点和volatile关键字很像,同时Synchronized代码块中的指令不会和Synchronized代码块之前和之后的指令进行重排序,但是Synchronized代码块内部可能进行重排序。
总结: 1-5点,主要看对谁进行了加锁,多线程执行时,就必须获取到对应的锁才能对Synchronized修饰的代码进行执行
具体案例参考 https://baijiahao.baidu.com/s?id=1740505389877266267&wfr=spider&for=pc