如何解决线程安全问题?有几种方式?synchronized与lock有什么异同?
1.談談你對同步代碼塊中同步監視器和共享數據的理解以及各自要求?
同步監視器:俗稱鎖。①任何一個類的對象都可以充當;②多個線程共用同一把鎖。
共享數據:多個線程共同操作的數據。
2.什么情況會產生線程安全問題?
當多個線程同時共享同一個數據,做寫的操作時,可能會發生數據沖突問題,即產生線程安全問題。讀的操作不會發生線程安全問題。
(比如A在銀行取錢,查詢起初余額balance=5000;準備取3000;在做取錢操作的時候發生阻塞了,此時A女朋友也用A的賬戶查詢balance=5000;開始取4000,balance更新為1000,取錢成功;A阻塞完成,開始取3000,balance更新為-2000,取錢成功。
3.如何解決線程安全問題?有幾種方式?
當線程A在操作共享數據時,其他進程不能參與進來,直到線程A操作完成時,其他線程才可以開始操作共享數據。這種情況即使線程A出現了阻塞也不能被改變。
使用synchronized同步機制或lock鎖方式解決。
有兩種方式:1.synchronized同步代碼塊/同步方法
2.lock鎖
4.synchronized與lock有什么異同?
相同點:解決線程安全問題
不同點:
synchronized機制在執行完相應的同步代碼以后,自動地釋放同步監視器;
1.synchronized是隱式鎖,出了自動域自動釋放;Lock是顯式鎖,lock需要手動啟動同步lock()/手動結束同步unlock()/在finally里釋放,否則容易出現死鎖。
2.Lock只有代碼塊鎖,synchronized有代碼快鎖和方法鎖;
3.使用Lock鎖,JVM將花費較少的時間來調度線程,性能更好。并且具有更好的擴展性(提供更多的子類
優先使用順序:Lock–>同步代碼塊(已經進入了方法體,分配了相應資源)–>同步方法(在方法體外)
關于Lock
- 從JDK5.0開始,java提供了更強大的線程同步機制–>通過顯式定義同步鎖對象來實現同步。同步鎖使用Lock對象充當。
- java.util.concurrent.lock.Lock接口是控制多個線程對共享資源進行訪問的工具。鎖提供了對共享資源的獨占訪問,每次只能有一個線程Lock對象加鎖,線程開始訪問共享資源之前應先獲得Lock對象。
- ReentrantLock類實現了Lock,它擁有與synchronized相同的并發性和內存語義,在實現線程安全的控制中,比較常用的是ReentrantLock,可以顯式加鎖、釋放鎖。
總結
以上是生活随笔為你收集整理的如何解决线程安全问题?有几种方式?synchronized与lock有什么异同?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM的批量加载/存储指令
- 下一篇: Mac下载安装sublime text