@Java | Thread synchronized - [ 线程同步锁 基本使用]
生活随笔
收集整理的這篇文章主要介紹了
@Java | Thread synchronized - [ 线程同步锁 基本使用]
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)實(shí)現(xiàn)了Runnable或者Callable接口類,可以通過多線程執(zhí)行同一實(shí)例的run或call方法,那么對(duì)于同一實(shí)例中的局部變量(非方法變量)就會(huì)有多個(gè)線程進(jìn)行更改或讀取,這就會(huì)導(dǎo)致數(shù)據(jù)不一致,synchronized(關(guān)鍵字)可以解決多線程共享數(shù)據(jù)同步的問題 修飾一個(gè)代碼塊:被修飾的代碼塊稱為同步語(yǔ)句塊,其作用的范圍是大括號(hào){}括起來的代碼,作用的對(duì)象是調(diào)用這個(gè)代碼塊的對(duì)象 修飾一個(gè)非靜態(tài)方法:被修飾的方法稱為同步方法,其作用的范圍是整個(gè)方法,作用的對(duì)象是調(diào)用這個(gè)方法的對(duì)象 修改一個(gè)靜態(tài)的方法:其作用的范圍是整個(gè)靜態(tài)方法,作用的對(duì)象是這個(gè)類的所有對(duì)象 修改一個(gè)類:其作用的范圍是synchronized后面括號(hào)括起來的部分,作用主的對(duì)象是這個(gè)類的所有對(duì)象 高能提示:
No1 > synchronized修飾的非靜態(tài)方法:如果一個(gè)對(duì)象有多個(gè)synchronized方法,只要一個(gè)線程訪問了其中的一個(gè)synchronized方法,則這個(gè)線程所屬對(duì)象的其它線程不能同時(shí)訪問這個(gè)對(duì)象中任何一個(gè)synchronized方法
No2 > synchronized關(guān)鍵字是不能繼承的:基類的方法synchronized function(){}在繼承類中并不自動(dòng)是synchronized function(){},而是變成了function(){}。繼承類需要你顯式的指定它的某個(gè)方法為synchronized方法,可以通過子類調(diào)用父類的同步方法來實(shí)現(xiàn)同步
No3 > 針對(duì)synchronized修飾代碼塊和非靜態(tài)方法,本質(zhì)上鎖的是代碼塊或非靜態(tài)方法對(duì)應(yīng)的對(duì)象(代碼塊是synchronized標(biāo)注的變量,非靜態(tài)方法是所在類對(duì)應(yīng)的實(shí)例),如果是不同的對(duì)象是可以同時(shí)訪問的
No4 > 實(shí)現(xiàn)同步是要很大的系統(tǒng)開銷作為代價(jià)的,甚至可能造成死鎖,所以盡量避免無謂的同步控制
No5 > 每個(gè)對(duì)象只有一個(gè)鎖(lock)與之相關(guān)聯(lián)
No6 > 在定義接口方法時(shí)不能使用synchronized關(guān)鍵字
No7 > 構(gòu)造方法不能使用synchronized關(guān)鍵字,但可以使用synchronized代碼塊來進(jìn)行同步
synchronized(o)修飾的代碼塊,其中o可以取值一個(gè)對(duì)象或者一個(gè)變量或者this亦或者Clz.class public class Sync implements Runnable {private byte[] lock = new byte[0];public void syncCode() {synchronized (lock) {// 同步代碼塊}}public void run .... } 注:零長(zhǎng)度的byte數(shù)組對(duì)象創(chuàng)建起來將比任何對(duì)象都經(jīng)濟(jì),查看編譯后的字節(jié)碼,生成零長(zhǎng)度的byte[]對(duì)象只需3條操作碼,而Object lock = new Object()則需要7行操作碼線程同步的目的是為了保護(hù)多個(gè)線程反問一個(gè)資源時(shí)對(duì)資源的破壞。 線程同步方法是通過鎖來實(shí)現(xiàn),每個(gè)對(duì)象都有切僅有一個(gè)鎖,這個(gè)鎖與一個(gè)特定的對(duì)象關(guān)聯(lián),線程一旦獲取了對(duì)象鎖,其他訪問該對(duì)象的線程就無法再訪問該對(duì)象的其他非同步方法 對(duì)于靜態(tài)同步方法,鎖是針對(duì)這個(gè)類的,鎖對(duì)象是該類的Class對(duì)象。靜態(tài)和非靜態(tài)方法的鎖互不干預(yù)。一個(gè)線程獲得鎖,當(dāng)在一個(gè)同步方法中訪問另外對(duì)象上的同步方法時(shí),會(huì)獲取這兩個(gè)對(duì)象鎖。 對(duì)于同步,要時(shí)刻清醒在哪個(gè)對(duì)象上同步,這是關(guān)鍵。 編寫線程安全的類,需要時(shí)刻注意對(duì)多個(gè)線程競(jìng)爭(zhēng)訪問資源的邏輯和安全做出正確的判斷,對(duì)"原子"操作做出分析,并保證原子操作期間別的線程無法訪問競(jìng)爭(zhēng)資源。 當(dāng)多個(gè)線程等待一個(gè)對(duì)象鎖時(shí),沒有獲取到鎖的線程將發(fā)生阻塞。 死鎖是線程間相互等待鎖鎖造成的,在實(shí)際中發(fā)生的概率非常的小,一旦程序發(fā)生死鎖,程序?qū)⑺赖?/li>
synchronized使用說明
作用范圍
synchronized是Java中的關(guān)鍵字,是一種同步鎖。它修飾的對(duì)象有以下幾種:No1 > synchronized修飾的非靜態(tài)方法:如果一個(gè)對(duì)象有多個(gè)synchronized方法,只要一個(gè)線程訪問了其中的一個(gè)synchronized方法,則這個(gè)線程所屬對(duì)象的其它線程不能同時(shí)訪問這個(gè)對(duì)象中任何一個(gè)synchronized方法
No2 > synchronized關(guān)鍵字是不能繼承的:基類的方法synchronized function(){}在繼承類中并不自動(dòng)是synchronized function(){},而是變成了function(){}。繼承類需要你顯式的指定它的某個(gè)方法為synchronized方法,可以通過子類調(diào)用父類的同步方法來實(shí)現(xiàn)同步
No3 > 針對(duì)synchronized修飾代碼塊和非靜態(tài)方法,本質(zhì)上鎖的是代碼塊或非靜態(tài)方法對(duì)應(yīng)的對(duì)象(代碼塊是synchronized標(biāo)注的變量,非靜態(tài)方法是所在類對(duì)應(yīng)的實(shí)例),如果是不同的對(duì)象是可以同時(shí)訪問的
No4 > 實(shí)現(xiàn)同步是要很大的系統(tǒng)開銷作為代價(jià)的,甚至可能造成死鎖,所以盡量避免無謂的同步控制
No5 > 每個(gè)對(duì)象只有一個(gè)鎖(lock)與之相關(guān)聯(lián)
No6 > 在定義接口方法時(shí)不能使用synchronized關(guān)鍵字
No7 > 構(gòu)造方法不能使用synchronized關(guān)鍵字,但可以使用synchronized代碼塊來進(jìn)行同步
1. 修飾一個(gè)代碼塊
public void syncCode(Object o) {synchronized (o) {// 同步代碼塊} } 上面的鎖就是o這個(gè)對(duì)象,當(dāng)然多個(gè)線程同步需要保證o這個(gè)對(duì)象是同一個(gè),這是有明確的對(duì)象作為鎖的情況,如果只是想單純的讓某一段代碼同步,并沒有明確的對(duì)象作為鎖,可以創(chuàng)建一個(gè)特殊的instance變量來充當(dāng)鎖synchronized(o)修飾的代碼塊,其中o可以取值一個(gè)對(duì)象或者一個(gè)變量或者this亦或者Clz.class public class Sync implements Runnable {private byte[] lock = new byte[0];public void syncCode() {synchronized (lock) {// 同步代碼塊}}public void run .... } 注:零長(zhǎng)度的byte數(shù)組對(duì)象創(chuàng)建起來將比任何對(duì)象都經(jīng)濟(jì),查看編譯后的字節(jié)碼,生成零長(zhǎng)度的byte[]對(duì)象只需3條操作碼,而Object lock = new Object()則需要7行操作碼
2. 修飾一個(gè)非靜態(tài)方法
public synchronized void method() {// .....} 此時(shí)鎖的是調(diào)用這個(gè)同步方法的對(duì)象3. 修飾一個(gè)靜態(tài)方法
public synchronized static void method() {// .....} synchronized修飾的靜態(tài)方法鎖定的是這個(gè)類的所有對(duì)象4. 修飾類
public class Sync implements Runnable {public void syncCode() {synchronized (Sync.class) {// 同步代碼塊}}public void run .... } 和作用于靜態(tài)方法一樣,synchronized作用于一個(gè)類時(shí),是給這個(gè)類加鎖,類的所有對(duì)象用的是同一把鎖總結(jié)
總結(jié)
以上是生活随笔為你收集整理的@Java | Thread synchronized - [ 线程同步锁 基本使用]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python认识if语句_python初
- 下一篇: java 多线程池_Java项目中,线程