在Java中,synchronized關鍵字是用來控制線程同步的,就是在多線程的環境下,控制synchronized代碼段不被多個線程同時執行。synchronized既能夠加在對象上,也能夠加在方法上,而加鎖的這段代碼稱爲「互斥區」或者「臨界區」安全
線程安全概念:多線程
當多個線程訪問某一個類(對象或方法)時,這個類始終都能表現出正確的行爲,那麼這個類(對象或方法)就是線程安全的。
this
Java中的ReentrantLock和synchronized兩種鎖定機制的對比spa
線程是進程內的執行單元
synchronized
一、指定加鎖對象:對給定對象加鎖,進入同步代碼前要得到給定對象的鎖。
二、直接做用於實例方法:對當前實例加鎖,進入同步代碼前要得到當前實例的鎖。線程
--> synchronize(this)
三、直接做用於靜態方法:對當前類加鎖,進入同步代碼前要得到當前類的鎖對象
-->synchronize(objiect.class)進程
說明:當加鎖的方法是static修飾的方法,須要用當前類的鎖object.class 而不是 new Object實例鎖。同步
1、加在 對象上class
2、加在 方法上object
說明:加在 靜態方法上, 不一樣的線程 須要用一個對象 對象,才能能夠 控制線程同步
3、加在 靜態方法上
說明:加在 靜態方法上,鎖屬於 這個類對象, 不一樣的線程 用 不一樣的 對象,也能夠 控制線程同步
當用兩個線程,分別調用output和output2方法時,用synchrozed(this),能夠線程同步。
當用兩個線程,分別調用output和output3方法時,必須用synchrozed(object .class),才能夠線程同步。