Java-解读Java并发编程实战-可爱猪猪解读

【连载】第1章-1.3线程带来的风险

2019-08-19  本文已影响2人  可爱猪猪

格言:在程序猿界混出点名堂!

《JAVA并发编程实战》解读
【连载】第1章-1.3线程带来的风险

回顾:在1.2中介绍线程的优势,凡事必有两面性,这一节,本书的作者给我们罗列了线程的风险点。

安全性问题

直接看下面的经典例子i++

@NotThreadSafe
public class UnsafeSequence{
  private int value;
  /**返回一个唯一的数值*/
  public int getNext(){
   return value++;
  }
}

@ThreadSafe
public class UnsafeSequence{
  @GuardedBy("this") private int value;
  /**返回一个唯一的数值*/
  public synchronized int getNext(){
   return value++;
  }
}

synchronized关键字会保证,getNext()的代码保证一次只有一个线程执行,并且执行完成后,将value同步到主存。

活跃性问题

活跃性问题为多线程导致的死锁、饥饿、活锁,依赖于不同线程事件发生的时序。比如,经典的饥饿的例子就是A持有B的锁,B持有A的锁,导致死锁。代码来说话:

@DeadLock
public class TranService{
      public void tranMoney(Account from,Account to){
             synchronized(from){
                  synchronized(to){
                         from.withdraw();
                         to.deposit();
                  }
            }
      }
    public static void main(String[] args){
       Account a=...,b=...;
       TranService tranService=..;
      // 某系统发起a向b转账
       new Thread(()->{
             tranService.tranMoney(a,b);
       }).start();
     // 某系统发起b向a转账
      new Thread(()->{
             tranService.tranMoney(b,a);
       }).start();
      
    }
}

性能问题

多线程虽然能利用多核优势提升整体性能,但同样也会带来性能问题。

知识点

  1. 线程带来的问题。(活跃性/安全性/性能)
  2. 理解术语:活跃性竞态协同
  3. i++的理解。
  4. 死锁的产生原理。
  5. synchronized的初步了解。

喜欢连载可关注微信公众号:逗哥聊IT。


上一篇 下一篇

猜你喜欢

热点阅读