当前位置: 移动互联网学院 > Java培训 > JAVA开发 > Java多线程安全问题解决方法
Java多线程安全问题解决方法 时间:2017-06-19     来源:华清远见JAVA学院

今天华清Java学院和大家分享一下Java多线程安全问题的实现方法。

1.如何保证Java多线程安全

不在线程之间共享状态变量

将状态变量修改成不可变的变量

在访问状态变量时使用同步

2.实现Java多线程安全有那些方法

A:内置锁

Java代码

public class widget{

public synchronized void doSomething(){

.....

}}

public class LoggingWidget extends Widget{

public synchronized void doSomething(){

System.out.println(toString()+":calling do Something");

super.doSomething();

}}

这个时候子类同步调用父类方法是可行,因为内置锁是可以被重入的,也就是子类可以获取到父类的锁,才不会造成死锁。

B:使用java.util.concurrent包中定义的并发类 如

ConcurrentHashMap

ConcurrentLinkedQueue

ConcurrentSkipListMap

等等

但是他们支持的并发实现并不一定意味着操作的原子性,他们只是保证数据结构不被破坏

C:添加volatile关键字

private static volatile int value=0;//你可以添加volatile关键字 然后删除synchronized关键字,但是也要看你的业务

public static void setTvalue(int n){

value=n//这个时候,如果value+=n语句,那么这个就不是原子操作,还是要用synchronized的

}

D:同步语句的注意

你可以使用一个对象来标记同步块,不要使用this,因为this可能代表当前的类,this造成同步的区域是整个类,其他对象就无法调用类中不是同步的方法了,需要等待锁从this指的类中释放才能进行了。所以你可以定义一个对象,然后让同步块的锁指向整个对象来缩小同步块的锁影响范围。

private Object myLock=new Object();

public void add (int a ){

synchronized(myLock){

v+=a;

}}

E:不要在同步块中调用其他的同步块

这句话不是绝对的,如果你很了解代码的同步,锁,等信息,你可以大胆的这么做

X