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的紅燈還在亮