136-多线程-同步代码块解决两种线程创建方式的线程安全问题_哔哩哔哩_bilibili
1.安全问题
关键在于某些数据操作
2.解决
2.1同步代码块
相当于给数据操作加了互斥锁
2.1.1在实现runnable接口的方式下
锁对象要求必须是唯一的,因为可以看成是谁占了这个对象(锁)谁就在独享这段代码,必须让出对象别人才能用,如果是多个对象那么每个线程都各用各的,达不到互斥的效果。
比如:
那么锁对象怎么来?
一个实现类实例传给多个Thread构造,实例里obj对象也只有一个。因此总共唯一obj
tips:在这种情况下,用什么对象只要唯一都可以,所以可以用this代替obj
2.1.2在继承thread的方式下
obj必须加static来保证多个对象时候obj的唯一
2.1.3综上:
2.2同步方法
2.2.1过渡
2.2.2同步方法
在方法前面加同步关键字
如果同步方法是非静态的,默认同步监视器(锁)是this
2.2.3在实现runnable接口的方式下
2.2.4在继承thread的方式下
错误:
正确,但要注意该方法功能是否适合静态,是否应该和类绑定:
2.2.5综上:
2.3弊端
3.线程安全懒汉式
3.1同步方法
3.2同步代码块
3.3效率升级版