java中類中多個Synchronized方法

類中多個Synchronized方法 
馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
下面給出一個例子,說明一個class中有兩個方法synchronized的情況。它們互相阻擋的用法和上面的“一個方法有synchronized”的情況是一樣的。

例1.9.5:

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

class MyThread1 extends Thread {
    A a;
    public MyThread1(A a) {
        this.a = a;
    }
    public void run() {
        a.f1();
    }
}

class MyThread2 extends Thread {
    A a;
    public MyThread2(A a) {
        this.a = a;
    }
    public void run() {
        a.f2();
    }
}
public class TestMark_to_win {
    public static void main(String[] args) {
        A a = new A();
        Thread t1 = new MyThread1(a);
        Thread t2 = new MyThread2(a);
        t1.start();
        t2.start();
    }
}


輸出結果:

f1 i = 0
f1 i = 1
f1 i = 2
f2 i = 0
f2 i = 1
f2 i = 2

上面兩個synchronized的方法如其中一個無限循環(huán),一定會擋住其他的方法。下面的例子先進f1的線程死死擋住想進f2的線程。




例1.9.5_b:

class A {
    public synchronized void f1() {
        //快速無限循環(huán),別的線程什么也做不了
            while (true) {
            }
    }
  
    public synchronized void f2() {
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            System.out.println("f2 i = " + i);
        }
    }
}

class MyThread1 extends Thread {
    A a;
    public MyThread1(A a) {
        this.a = a;
    }
    public void run() {
        a.f1();
    }
}

class MyThread2 extends Thread {
    A a;
    public MyThread2(A a) {
        this.a = a;
    }
    public void run() {
        a.f2();
    }
}
public class TestMark_to_win {
    public static void main(String[] args) {
        A a = new A();
        Thread t1 = new MyThread1(a);
        Thread t2 = new MyThread2(a);
        t1.start();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }     

        t2.start();
    }
}

結果什么也輸不出來

如果我們想達到這個目的:想用f1的線程互相擋住,而想用f1和f2的不同線程之間互相不擋,我們得用不同的鎖。




例1.9.5_c:

class A {
    private Object lock1 = new Object();
    private Object lock2 = new Object();
    public void f1() {
        synchronized (lock1) {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"正在無限耗用你的CPU,eclipse的紅燈還在亮");
            }
        }
    }

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

class MyThread1 extends Thread {
    A a;
    public MyThread1(A a) {
        this.a = a;
    }
    public void run() {
        a.f1();
    }
}

class MyThread2 extends Thread {
    A a;
    public MyThread2(A a) {
        this.a = a;
    }
    public void run() {
        a.f2();
    }
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        Thread t1 = new MyThread1(a);
        Thread t11 = new MyThread1(a);
        Thread t2 = new MyThread2(a);
        t1.start();
        t11.start();
        t2.start();
    }
}


輸出結果:
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
f2 i = 0Thread-2
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
f2 i = 1Thread-2
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
f2 i = 2Thread-2
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮
Thread-1正在無限耗用你的CPU,eclipse的紅燈還在亮