java中線程同步Synchronized,監(jiān)視器monitor和鎖lock的關(guān)系

線程同步Synchronized,監(jiān)視器monitor和鎖lock的關(guān)系
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
既然有關(guān)監(jiān)視器monitor的概念比較難,大家怎么解釋的都有。首先我給出一下java的官方文檔,也是最權(quán)威的解釋?zhuān)?br>
Synchronization is built around an internal entity known as the intrinsic lock or monitor lock. (The API specification often refers to this entity simply as a "monitor."),Every object has an intrinsic lock associated with it. By convention, a thread that needs exclusive and consistent access to an object's fields has to acquire the object's intrinsic lock before accessing them, and then release the intrinsic lock when it's done with them.

源自:http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

根據(jù)官方文檔,我來(lái)說(shuō)說(shuō)我的看法。馬克-to-win: synchronized 工作機(jī)制是這樣的:Java中每個(gè)對(duì)象都有一把鎖與之相關(guān)聯(lián),鎖控制著對(duì)象的synchronized代碼。一個(gè)要執(zhí)行對(duì)象的synchronized代碼的線程必須先獲得那個(gè)對(duì)象的鎖。(即使兩個(gè)方法分別被冠以synchronized,見(jiàn)例子例1.9.3-b)有點(diǎn)兒監(jiān)控(monitor)的感覺(jué)嗎?

synchronized關(guān)鍵字使用方式有兩種:synchronized方法和synchronized塊。以下會(huì)給出例子:





例1.9.3-本章源碼

class A {
    public synchronized void f1() {
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            System.out.println("i = " + i);
        }
    }
}

class MyThread extends Thread {
    A a;

    public MyThread(A a) {
        this.a = a;
    }
    public void run() {
        a.f1();
    }
}

public class TestMark_to_win {
    public static void main(String[] args) {
        A a = new A();
        Thread t1 = new MyThread(a);
        Thread t2 = new MyThread(a);
        t1.start();
        t2.start();
    }
}

運(yùn)行結(jié)果是
i = 0
i = 1
i = 2
i = 0
i = 1
i = 2

假如你去掉了關(guān)鍵字"synchronized"

結(jié)果就變成了
i = 0
i = 0
i = 1
i = 1
i = 2
i = 2

為什么?當(dāng)有“synchronized”的關(guān)鍵字,兩個(gè)線程必須序列化執(zhí)行。否則,他們將并發(fā)執(zhí)行。