1. 程式人生 > >synchronized修飾普通方法和靜態方法

synchronized修飾普通方法和靜態方法

對象 -s 修飾 style 安全 安全問題 才會 htable 會有

首先,要知道,synchronized關鍵字修飾普通方法時,獲得的鎖是對象鎖,也就是this。而修飾靜態方法時,鎖是類鎖,也就是類名.class。

synchronized修飾普通方法

Synchronized修飾普通方法時,鎖是對象鎖(this)。

當該類中有多個普通方法被Synchronized修飾(同步),那麽這些方法的鎖都是這個類的一個對象this。多個線程訪問這些方法時,如果這些線程調用方法時使用的是同一個該類的對象,雖然他們訪問不同方法,但是他們使用同一個對象來調用,那麽這些方法的鎖就是一樣的,就是這個對象,那麽會造成阻塞。如果多個線程通過不同的對象來調用方法(一般都是通過同一個對象訪問),那麽他們的鎖就是不一樣的,不會造成阻塞。

基本上都是通過同一個對象操作的,因為不同對象的話,每個對象的數據都不一樣,當然不會出現安全問題。

多線程的安全問題,都是對於同一個對象操作的,(操作靜態數據不需要同一個對象)

例如,多線程對hashtable操作,肯定是對同一個對象,才會有共享數據。

Hashtable中使用Synchronized來修飾方法,這樣相當於對整張表進行鎖定了,因為多個線程如果通過同一個HashTable對象訪問方法,就會造成阻塞。

但是,通過同一個對象調用非同步方法,是可以的,不會阻塞。

synchronized修飾靜態方法

鎖是類鎖(.class)。這個範圍就比對象鎖大。這裏就算是不同對象,但是只要是該類的對象,就使用的是同一把鎖。多個線程調用該類的同步的靜態方法時,都會阻塞。

synchronized修飾普通方法和靜態方法