java synchronized的初步理解

本博客每一個(gè)小標(biāo)題下的內(nèi)容獨(dú)立且完整常空,如只是想了解某個(gè)小標(biāo)題下的內(nèi)容汞斧,只需前往看該小標(biāo)題即可瞪浸。

1. 多線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的同一個(gè)非靜態(tài)synchronized方法

完整代碼:

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 普通同步方法A
     */
    public void methodA() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodA:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

小標(biāo)題已經(jīng)準(zhǔn)確表達(dá)了上面這塊代碼的意思生真,運(yùn)行結(jié)果如下:

同一個(gè)對(duì)象同一個(gè)非靜態(tài)同步方法.png

由執(zhí)行結(jié)果可知,兩個(gè)線程中其中一個(gè)線程執(zhí)行完才會(huì)執(zhí)行第二個(gè)線程捺宗。結(jié)論就是柱蟀,多個(gè)線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的同一個(gè)非靜態(tài)synchronized方法時(shí),先獲取到鎖的線程執(zhí)行完畢后才會(huì)執(zhí)行其它線程蚜厉。也就是說(shuō)synchronized(this)這種鎖可以鎖定一個(gè)非靜態(tài)synchronized方法长已,只讓獲取了該鎖的線程執(zhí)行,其它線程在該線程未執(zhí)行完畢之前不能執(zhí)行

2. 多線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同非靜態(tài)synchronized方法

完整代碼:

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodB();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 普通同步方法A
     */
    public void methodA() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodA:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 普通同步方法B
     */
    public void methodB() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodB:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

運(yùn)行結(jié)果如下:

同一個(gè)對(duì)象不同非靜態(tài)同步方法.png

由執(zhí)行結(jié)果可知昼牛,兩個(gè)線程中其中一個(gè)線程執(zhí)行完才會(huì)執(zhí)行第二個(gè)線程术瓮。結(jié)論是多個(gè)線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同非靜態(tài)synchronized方法時(shí),先獲取到鎖的線程執(zhí)行完畢后才會(huì)執(zhí)行其它線程贰健。也就是說(shuō)胞四,synchronized(this)這種鎖鎖定的范圍是該對(duì)象的所有非靜態(tài)synchronized方法,而不單單是獲取了該鎖的線程正在執(zhí)行的非靜態(tài)synchronized方法

3. 多線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同方法伶椿,一個(gè)是非靜態(tài)synchronized方法辜伟,一個(gè)是非靜態(tài)非synchronized方法

完整代碼:

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodC();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 普通同步方法A
     */
    public void methodA() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodA:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 普通方法,非同步
     */
    public void methodC() {
        for (int i = 0; i < 4; i++) {
            System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodC:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

運(yùn)行結(jié)果如下:

同一個(gè)對(duì)象一個(gè)非靜態(tài)同步方法一個(gè)非靜態(tài)非同步方法.png

由執(zhí)行結(jié)果可知脊另,兩個(gè)線程并發(fā)執(zhí)行导狡,沒(méi)有先后順序。結(jié)論是多個(gè)線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同方法時(shí)偎痛,一個(gè)是非靜態(tài)synchronized方法旱捧,一個(gè)是非靜態(tài)非synchronized方法,這兩線程并發(fā)運(yùn)行踩麦。也就是說(shuō)廊佩,synchronized(this)這種鎖鎖定的是該對(duì)象的所有非靜態(tài)synchronized方法,并不會(huì)鎖定該對(duì)象的非靜態(tài)非synchronized方法靖榕。

4. 多線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同方法,一個(gè)是非靜態(tài)synchronized方法顽铸,一個(gè)是靜態(tài)synchronized方法

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();
//        final TestClass testClassNext = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodE();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 普通同步方法A
     */
    public void methodA() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodA:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 靜態(tài)同步方法E
     */
    public synchronized static void methodE() {
        for (int i = 0; i < 4; i++) {
            System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodE:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

運(yùn)行結(jié)果如下:

同一個(gè)對(duì)象一個(gè)靜態(tài)同步方法一個(gè)非靜態(tài)同步方法.png

由執(zhí)行結(jié)果可知茁计,兩個(gè)線程并發(fā)執(zhí)行,沒(méi)有先后順序谓松。結(jié)論是多個(gè)線程并發(fā)訪問(wèn)同一個(gè)對(duì)象的不同方法時(shí)星压,一個(gè)是非靜態(tài)synchronized方法,另一個(gè)是靜態(tài)synchronized方法鬼譬,這兩線程并發(fā)運(yùn)行娜膘。也就是說(shuō),优质,synchronized(this)這種鎖鎖定的范圍是這個(gè)對(duì)象所有的非靜態(tài)synchronized方法竣贪,而靜態(tài)synchronized鎖鎖定的是該類的所有對(duì)象的所有靜態(tài)synchronized方法军洼,兩個(gè)鎖鎖的作用范圍不一樣,執(zhí)行起來(lái)就不會(huì)相互鎖定

5. 多線程并發(fā)訪問(wèn)同一個(gè)類不同對(duì)象的同一個(gè)非靜態(tài)synchronized方法

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();
        final TestClass testClassNext = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodA();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClassNext.methodA();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 普通同步方法A
     */
    public void methodA() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodA:" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

運(yùn)行結(jié)果如下:

不同對(duì)象同一個(gè)非靜態(tài)同步方法.png

由執(zhí)行結(jié)果可知演怎,兩個(gè)線程并發(fā)執(zhí)行匕争,沒(méi)有先后順序。結(jié)論是多個(gè)線程并發(fā)訪問(wèn)同一個(gè)類不同對(duì)象的同一個(gè)非靜態(tài)synchronized方法時(shí)爷耀,這兩線程并發(fā)運(yùn)行甘桑。也就是說(shuō),synchronized(this)這種鎖鎖定的范圍是該對(duì)象的非靜態(tài)synchronized方法歹叮,而不能鎖定該類的另一個(gè)實(shí)例的非靜態(tài)synchronized方法跑杭。

6. 多線程并發(fā)訪問(wèn)同一個(gè)類的不同對(duì)象的同一個(gè)靜態(tài)synchronized方法

public class myClass {

    public static void main(String[] args) {

        final TestClass testClass = new TestClass();
        final TestClass testClassNext = new TestClass();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClass.methodD();
            }
        }, "線程1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                testClassNext.methodD();
            }
        }, "線程2");

        thread1.start();
        thread2.start();
    }
}

class TestClass {

    /**
     * 靜態(tài)同步方法D
     */
    public synchronized static void methodD() {
        for (int i = 0; i < 4; i++) {
            System.out.println(Thread.currentThread().getName() + "正在執(zhí)行methodD:" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

運(yùn)行結(jié)果如下:

不同對(duì)象同一個(gè)靜態(tài)同步方法.png

由執(zhí)行結(jié)果可知,兩個(gè)線程中其中一個(gè)線程執(zhí)行完才會(huì)執(zhí)行第二個(gè)線程咆耿。結(jié)論是多線程并發(fā)訪問(wèn)同一個(gè)類的不同對(duì)象的同一個(gè)靜態(tài)synchronized方法時(shí)德谅,先獲取到鎖的線程執(zhí)行完畢之后才會(huì)執(zhí)行下一個(gè)線程。也就是說(shuō)票灰,靜態(tài)synchronized鎖鎖定的范圍已經(jīng)不再是單個(gè)對(duì)象的靜態(tài)synchronized方法了女阀,而是所有對(duì)象的靜態(tài)synchronized方法。

上述所有情況的總結(jié)

  1. 在一個(gè)類對(duì)象范圍內(nèi)屑迂,非靜態(tài)synchronized鎖不僅鎖定當(dāng)前獲取該鎖的線程正在執(zhí)行的非靜態(tài)synchronized方法浸策,還會(huì)鎖定該對(duì)象的其他所有非靜態(tài)synchronized方法,但不會(huì)鎖定該對(duì)象的非靜態(tài)非synchronized方法惹盼、靜態(tài)非synchronized方法和靜態(tài)synchronized方法庸汗;

  2. 非靜態(tài)synchronized鎖作用范圍是在一個(gè)對(duì)象里,并不會(huì)干涉到其他線程調(diào)用該類的另一個(gè)對(duì)象的非靜態(tài)synchronized方法手报,而靜態(tài)synchronized鎖可以影響到其它對(duì)象蚯舱;

  3. 靜態(tài)synchronized鎖會(huì)鎖定該類的所有對(duì)象的所有靜態(tài)synchronized方法,但不會(huì)鎖定該類的所有對(duì)象的的靜態(tài)非synchronized方法掩蛤、非靜態(tài)synchronized方法枉昏、非靜態(tài)非synchronized方法;

  4. 非靜態(tài)synchronized鎖鎖定的是該類的一個(gè)實(shí)例對(duì)象揍鸟,靜態(tài)synchronized鎖鎖定的其實(shí)是該類的Class對(duì)象兄裂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阳藻,隨后出現(xiàn)的幾起案子晰奖,更是在濱河造成了極大的恐慌,老刑警劉巖腥泥,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾南,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛔外,警方通過(guò)查閱死者的電腦和手機(jī)蛆楞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門溯乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人臊岸,你說(shuō)我怎么就攤上這事橙数。” “怎么了帅戒?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵灯帮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我逻住,道長(zhǎng)钟哥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任瞎访,我火速辦了婚禮腻贰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扒秸。我一直安慰自己播演,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布伴奥。 她就那樣靜靜地躺著写烤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾徙。 梳的紋絲不亂的頭發(fā)上洲炊,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音尼啡,去河邊找鬼暂衡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛崖瞭,可吹牛的內(nèi)容都是我干的狂巢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼书聚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隧膘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寺惫,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹦疑,沒(méi)想到半個(gè)月后西雀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歉摧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年艇肴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腔呜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡再悼,死狀恐怖核畴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冲九,我是刑警寧澤谤草,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站莺奸,受9級(jí)特大地震影響丑孩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灭贷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一温学、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甚疟,春花似錦仗岖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至黄痪,卻和暖如春紧帕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桅打。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工是嗜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挺尾。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓鹅搪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遭铺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丽柿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容