解决多线程安全问题方法
解决多线程安全问题方法
Ld_kaiyuan 发表于6个月前
解决多线程安全问题方法
  • 发表于 6个月前
  • 阅读 14
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

1,如何保证线程安全

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

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

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

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

A:内置锁

Java代码

  1. public class widget{  
  2.   
  3.     public synchronized void doSomething(){  
  4.   
  5.        .....  
  6.     }  
  7.   
  8. }  
  9.   
  10. public class LoggingWidget extends Widget{  
  11.   
  12.     public synchronized void doSomething(){  
  13.   
  14.        System.out.println(toString()+":calling do Something");  
  15.        super.doSomething();  
  16.   
  17.     }  
  18.   
  19. }  

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

 

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

      ConcurrentHashMap

      ConcurrentLinkedQueue

      ConcurrentSkipListMap

      等等

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

 

4,添加volatile关键字

Java代码

  1. private static volatile int value=0;//你可以添加volatile关键字 然后删除synchronized关键字,但是也要看你的业务  
  2.   
  3. public static void setTvalue(int n){  
  4.     value=n//这个时候,如果value+=n语句,那么这个就不是原子操作,还是要用synchronized的  
  5. }  

 5,同步语句的注意

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

       

Java代码

  1. private Object myLock=new Object();  
  2.   
  3. public void add (int a ){  
  4.   
  5.     synchronized(myLock){  
  6.        
  7.         v+=a;  
  8.     }  
  9. }  

 

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

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

共有 人打赏支持
粉丝 3
博文 42
码字总数 7079
×
Ld_kaiyuan
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: