/* * 題目:判斷打印的 "one" or "two" ? * * 1. 兩個普通同步方法,兩個線程,標準打印, 打印? //one two * 2. 新增 Thread.sleep() 給 getOne() ,打印? //one two * 3. 新增普通方法 getThree() , 打印? //three one two * 4. 兩個普通同步方法,兩個 Number 對象,打印? //two one * 5. 修改 getOne() 爲靜態同步方法,打印? //two one * 6. 修改兩個方法均爲靜態同步方法,一個 Number 對象? //one two * 7. 一個靜態同步方法,一個非靜態同步方法,兩個 Number 對象? //two one * 8. 兩個靜態同步方法,兩個 Number 對象? //one two * * 線程八鎖的關鍵: * ①非靜態方法的鎖默認爲 this, 靜態方法的鎖爲 對應的 Class 實例 * ②某一個時刻內,只能有一個線程持有鎖,不管幾個方法。 */ public class TestThread8Monitor { public static void main(String[] args) { Number number = new Number(); Number number2 = new Number(); new Thread(new Runnable() { @Override public void run() { number.getOne(); } }).start(); new Thread(new Runnable() { @Override public void run() { // number.getTwo(); number2.getTwo(); } }).start(); /*new Thread(new Runnable() { @Override public void run() { number.getThree(); } }).start();*/ } } class Number{ public static synchronized void getOne(){//Number.class try { Thread.sleep(3000); } catch (InterruptedException e) { } System.out.println("one"); } public synchronized void getTwo(){//this System.out.println("two"); } public void getThree(){ System.out.println("three"); } }