上一篇說的多線程操作都是同一種操作,即j--,若有另一種操作要做j++操作呢?因每種操作都個操作都要覆寫run()方法,所以兩種操作要放在不同的類中,那共享變量j放在哪裏呢?此時通過內部類即可很方便實現。
public class TestThread {
private int j = 100;
public class Dec implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
sale();
}
}
}
public synchronized void sale() {//不知sale方法寫在Dec類裏面,
if (j > 0) {
System.out.println("賣第" + j + "張票!");
j--;
}
}
public class Inc implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName());
buy();
}
}
}
public synchronized void buy() {
if (j < 100) {
j++;
System.out.println("買第" + j + "張票!氣死你");
}
}
public void begin(){
Dec d=new Dec();
Inc i=new Inc();
new Thread(d,"axue2").start();
new Thread(i,"shixin1").start();
new Thread(d,"axue1").start();
new Thread(i,"shixin2").start();
}
}
當一個線程進入一個對象的一個synchronized方法後,其他線程只能訪問該對象的其他非同步方法,同步方法不能進入。
這裏需要強調的事“該對象”,上面例子中如果把sale()方法放到Dec類中,把buy()方法放到Inc類中,則synchronized則會不起作用,會同時操作共享變量j。