多线程之间实现同步
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
目標(biāo):
? ? 1.理解線程安全?
????2.synchronized用法
????3.死鎖
一、什么是線程安全問題?
? ??? ? 當(dāng)多個(gè)線程同時(shí)共享 ,同一個(gè)全局變量或靜態(tài)變量,在做寫的操作時(shí),可能會(huì)發(fā)生數(shù)據(jù)沖突問題。
? 這就是線程安全問題,但是當(dāng)做讀的操作是不會(huì)發(fā)生數(shù)據(jù)沖突問題的。
例子:
????? ? 比如搶火車票。
1號(hào)窗口,2號(hào)窗口,同時(shí)出售第一張火車票,這樣就是現(xiàn)成安全問題?
結(jié)論:當(dāng)多個(gè)線程同時(shí)共享同一個(gè)全局變量或者靜態(tài)變量,在做寫的操作時(shí)可能會(huì)發(fā)生數(shù)據(jù)沖突,造成線程安全問題。
那么如何解決線程安全問題呢?
?答:使用多線程之間同步或使用鎖(lock)。
什么是線程之間的同步呢?
既然能解決線程安全問題?多個(gè)線程共享同一個(gè)全局變量時(shí)可能發(fā)生數(shù)據(jù)沖突,那么是不是 同步就不能讓他們發(fā)生數(shù)據(jù)沖突呢?也就是 當(dāng)這個(gè)線程在使用這個(gè)全局變量的時(shí)候其他線程不能對這個(gè)全局變量進(jìn)行操作,必須等他操作完成之后才能進(jìn)行操作。
答:多個(gè)線程共享同一全局變量的時(shí)候,不會(huì)受到其他線程的干擾。
什么是鎖?
答:鎖顧名思義就是 給你這個(gè)東西上一個(gè)鎖,其他人進(jìn)不來。
代碼演示:
①同步代碼塊
? ? 什么是同步代碼塊?
? ? 答:就是講可能發(fā)生線程安全的代碼,給包括起來。
????synchronized(同一個(gè)數(shù)據(jù)){
?????????可能會(huì)發(fā)生線程沖突問題
????????}
? ?
這里就不會(huì)出現(xiàn) ?上面兩個(gè)線程搶同一張票的情況!
②同步函數(shù)
? ? 什么是同步函數(shù)?
? ? 答:方法被synchronized 修飾的方法,叫同步方法,
????
? ? 同步我們都要定義一個(gè)鎖對象,但是這個(gè)同步函數(shù)的鎖對象是誰呢?
? ? 答:this
? ? 證明方式:一個(gè)用明鎖,一個(gè)不用,看是否出現(xiàn)數(shù)據(jù)沖突問題。
????
③靜態(tài)同步函數(shù)
????? ? 什么是靜態(tài)同步函數(shù)?
????? ? 答:就是在同步函數(shù)前加一個(gè) static 關(guān)鍵字,
? ??????
????? ?那么靜態(tài)同步函數(shù)又是用的什么對象鎖呢?
????? ? 注意這里靜態(tài)方法都會(huì)被先加載。所以這里的鎖對象是 該函數(shù)的字節(jié)碼對象。
????? ? 可以通過getClass ? 或者 類名.class
????
總結(jié):
? ? synchronized 修飾方法 是用的this 鎖
? ? synchronized 修飾靜態(tài)方法 是用的 字節(jié)碼對象。
二、多線程死鎖
? ? 什么是死鎖?
? ? 兩個(gè)線程各抱著自己的鎖,等著對方釋放鎖。這就是死鎖。一直等下去。。。
? ? 什么原因造成的?
? ? 同步中嵌套同步!
????
面試題總結(jié):
????? ? 1.什么是線程安全問題?如何解決?
?????????答:當(dāng)多個(gè)線程共享同一個(gè)全局變量或靜態(tài)變量,可能會(huì)造成數(shù)據(jù)沖突。使用同步或者鎖。
????? ? 2.如何判斷會(huì)造成線程安全問題。
????????? ? 答:如果這個(gè)線程有寫的操作,就可能會(huì)發(fā)生線程安全問題,如果是讀的操作則不會(huì)發(fā)生線程安全問題
????? ? 3.什么是死鎖
????????? ? 答:同步中嵌套同步
?
轉(zhuǎn)載于:https://my.oschina.net/960823/blog/1518967
總結(jié)
- 上一篇: rlwrap解决sqlplus上下键和b
- 下一篇: 500 OOPS: cannot cha