1. 程式人生 > >JAVA-初步認識-第十三章-同步的前提

JAVA-初步認識-第十三章-同步的前提

單線程 自己的 png 使用 開啟 發的 安全 num 對象鎖

一.

日後開發的時候,看到這樣一種現象:看到了數據的錯誤是線程安全問題引發的,緊跟著就采取了同步措施,沒想到安全問題依然存在。

這種情況很痛苦,因為這時已經沒有解決方案了。

看到問題,以為同步就能解決問題,沒想到解決不了。(是否說安全問題,正確地使用同步都可以解決?)

這種問題是怎麽造成的呢?這裏必須要介紹同步的前提了,也就是能夠用同步解決什麽問題。

之所以要同步,是因為存在多個線程,(多個線程之間交替運行,導致安全隱患),如果是單線程的話,根本不需要同步。

因此,首先要保證有多個線程。接著要保證,多個線程用的是同一個鎖,

技術分享圖片

就一個線程,就不需要對象鎖。同步裏面就一個線程,同步就不需要。

現在修改一下程序,使得多個線程對應不同的對象鎖,

技術分享圖片

技術分享圖片

DOS結果裏顯示,同步裏面有多個線程,數據出錯了。因為每個線程開啟後,都有自己的run方法,每個run方法裏都有一個自己

局部的obj對象,意味著每個線程都有自己的鎖,一旦有了自己的鎖,就不再同步了。也意味著,一個同步代碼塊裏面,只有一個線程在運行。

技術分享圖片

技術分享圖片

為什麽放在run外面就可以,obj是成員變量,就在Ticket t這個對象當中,obj就和num一樣,都是成員。對象中有兩個成員,一個是num,一個是obj,obj在內存裏面是唯一的一個,剛才那種寫法,相當於棧內存中obj有四個,(棧中有四個線程,四個run,裏面自然有四個obj)

JAVA-初步認識-第十三章-同步的前提