「同步」是什麼意思?

我對synchronized關鍵字的用法和重要性有一些疑問。 安全

  • synchronized關鍵字的意義是什麼?
  • 方法應什麼時候synchronized
  • 從程序上和邏輯上是什麼意思?

#1樓

據我瞭解,同步基本上意味着編譯器在您的方法周圍編寫了monitor.enter和monitor.exit。 所以,根據使用方式的不一樣,它多是線程安全的(個人意思是,您可使用同步方法編寫對象,而同步方法根據類的用途不是線程安全的)。 多線程


#2樓

synchronized關鍵字是關於不一樣線程讀寫相同變量,對象和資源的所有內容。 這不是Java中的瑣碎話題,但如下是Sun的引文: 併發

synchronized方法提供了一種防止線程干擾和內存一致性錯誤的簡單策略:若是一個對象對多個線程可見,則對該對象變量的全部讀取或寫入都將經過同步方法完成。 spa

簡而言之:當您有兩個線程正在讀取和寫入同一個「資源」時,說一個名爲foo的變量,您須要確保這些線程以原子方式訪問該變量。 若是沒有synchronized關鍵字,線程1可能看不到對foo進行的更改線程2,或者更糟的是,它可能只更改了一半。 這在邏輯上不會是您所指望的。 線程

一樣,這是Java中不平凡的主題。 要了解更多信息,請在SO和Internet上探索有關如下主題: code

繼續探索這些主題,直到名稱「 Brian Goetz」與大腦中的「併發」一詞永久關聯。 對象


#3樓

synchronized關鍵字使線程在進入方法時得到鎖,所以只有一個線程能夠同時執行該方法(對於給定的對象實例,除非它是靜態方法)。 內存

這一般被稱爲使類具備線程安全性,可是我會說這是委婉的說法。 雖然同步確實能夠保護Vector的內部狀態免於損壞,但這一般對Vector的用戶沒有多大幫助。 資源

考慮一下: get

if (vector.isEmpty()){
     vector.add(data);
 }

即便所涉及的方法是同步的,因爲它們是分別鎖定和解鎖的,因此兩個不幸的是,定時線程能夠建立帶有兩個元素的向量。

所以,實際上,您還必須同步您的應用程序代碼。

由於方法級同步a)不須要時昂貴,而且b)須要同步時不夠,因此如今存在非同步的替換(對於Vector,則爲ArrayList)。

最近,併發程序包已發佈,其中包含許多巧妙的實用程序,可解決多線程問題。


#4樓

能夠將其視爲一種旋轉門,就像您在足球場上可能會發現的那樣。 有不少人想進入,可是在旋轉門上他們是「同步的」。 一次只能一我的經過。 全部想要經過的人都會作,可是他們可能必須等到能夠經過。


#5樓

同步簡單意味着沒有兩個線程能夠同時訪問該塊/方法。 當咱們說一個類的任何塊/方法都已同步時,這意味着一次只能有一個線程能夠訪問它們。 在內部嘗試訪問它的線程首先對該對象進行鎖定,只要該鎖定不可用,其餘線程就沒法訪問該類實例的任何同步方法/塊。

請注意,另外一個線程能夠訪問未定義爲同步的同一對象的方法。 線程能夠經過調用來釋放鎖

Object.wait()
相關文章
相關標籤/搜索