线程安全问题的解决方案
线程安全问题的解决方案
条件:
- 多线程并发
- 有共享数据
- 共享数据有修改行为
满足这些条件就会存在线程安全问题。怎么解决这个安全问题呢!线程排队执行,又称线程同步机制。
线程同步机制就是线程排队。这样就不能并发了,会牺牲效率。
异步就是并发 同步就是排队
java中每一个对象都有一个对象锁! 执行时,如果有synchronized并且属于这个类,那么执行这个方法时,这把锁就会被标记,当同时有另外一个线程对该对象进行执行该方法的时候,就会等待标记被释放,才能进入方法体!
线程同步机制语法 synchronized三种写法
-
同步代码块 灵活
//synchronized后面小括号中传的这个数据“相当关键”。这个数据必须是多线程共享的数据,才能达到多线程排队 synchronized (*.class){ //需要排队的方法块 } -
在实例方法上使用 表示锁的是this 并且同步代码块是整个方法体
public synchronized void method(){ //方法快 } -
在静态方法上使用synchronized 类锁 一个类一个锁 一百个对象也只有一个类锁
public synchronized static void method(){ //方法快 }
开发中怎么解决线程安全问题?
第一步方案:尽量使用局部变量代替“实例变量和静态变量”。
第二种方案:如果必是实力变量,那么可以考虑创建多个对象,这样实例变量的内存就不再共享了。(一个吸纳成对应一个对象,100个线程对应100个对象,对象不共享,就没有数据安全问题了。)
第三种方案:如果不能使用局部变量,对象也不能创建多个,就只能选择synchronized了,线程安全同步机制。
使用synchronized方法的时候,考虑到效率,被synchronied包含的代码块越少越好!
线程安全问题,主要似乎为了解决放在JVM堆区里面的变量
三大变量:
实际变量(堆中),静态变量(方法区),局部变量(栈中)

浙公网安备 33010602011771号