线程安全
synchronized(共享对象){}线程同步代码块
对象锁,一个线程占有后,另一个线程就无法占有了
实例变量在堆中 静态变量在方法区中 局部变量在栈中
局部变量永远不会存在线程安全问题(局部变量不共享,一个线程一个栈)
堆和方法区只有一个,是多线程共享的,所有可能存在线程安全问题
局部变量和常量不会有线程安全问题 常量不能修改
同步代码块越小效率越高
在实例方法上使用synchronized
synchronize出现在实例方法上,一定锁的是this,不能是其他对象,所以这种方式不灵活
synchronized出现在实例方法上表示整个方法都需要同步,可能会无故扩大同步的范围,导致程序的执行效率低,不常用
如果共享的对象就是this,并且整个方法的方法体都需要同步,建议使用这种方式
如果使用局部变量建议使用StringBuilder,因为局部变量不存在线程安全问题,StringBuffer效率比较低
在静态方法上使用synchronized表示类锁 类锁永远只有一把
死锁
不出异常也不会出现错误
怎么解决线程安全问题
第一种方案:尽量使用局部变量来代替实例变量和静态变量
第二种方案:如果必须是实例变量,那么可以考虑创建多个对象,这样实例变量的内存就不共享了
第三种方案:如果不能使用局部变量,对象也不能创建多个,这个时候就只能选择synchronized了

浙公网安备 33010602011771号