java中线程同步Synchronized,监视器monitor和锁lock的关系

线程同步Synchronized,监视器monitor和锁lock的关系
马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。
既然有关监视器monitor的概念比较难,大家怎么解释的都有。首先我给出一下java的官方文档,也是最权威的解释:

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

根据官方文档,我来说说我的看法。马克-to-win: synchronized 工作机制是这样的:Java中每个对象都有一把锁与之相关联,锁控制着对象的synchronized代码。一个要执行对象的synchronized代码的线程必须先获得那个对象的锁。(即使两个方法分别被冠以synchronized,见例子例1.9.3-b)有点儿监控(monitor)的感觉吗?

synchronized关键字使用方式有两种:synchronized方法和synchronized块。以下会给出例子:





例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();
    }
}

运行结果是
i = 0
i = 1
i = 2
i = 0
i = 1
i = 2

假如你去掉了关键字"synchronized"

结果就变成了
i = 0
i = 0
i = 1
i = 1
i = 2
i = 2

为什么?当有“synchronized”的关键字,两个线程必须序列化执行。否则,他们将并发执行。