如何保证线程安全 实现线程安全有那些方法

1,如何保证线程安全

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

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

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

 

2,实现线程安全有那些方法

A:内置锁

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();

    }

}

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

 

3,使用java.util.concurrent包中定义的并发类 如 

      ConcurrentHashMap

      ConcurrentLinkedQueue

      ConcurrentSkipListMap

      等等

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

 

4,添加volatile关键字

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

public static void setTvalue(int n){
    value=n//这个时候,如果value+=n语句,那么这个就不是原子操作,还是要用synchronized的
}

 5,同步语句的注意

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

       

private Object myLock=new Object();

public void add (int a ){

    synchronized(myLock){
     
        v+=a;
    }
}

 

 6,不要在同步块中调用其他的同步块

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值