package com.java.juc; /** * 題目:判斷打印 "one" or "two" * * 1.兩個普通同步方法,兩個線程 ,標准打印,打印?// one two * 2.新增Thread.sleep(3000) 給getOne() 打印? // 3s 后打印 one two * 3.新增普通方法 getThreee 打印?// 先打印three 三秒后打印 one two * 4.兩個普通同步方法,兩個number對象,打印? // two 3s后打印 one * 5.修改getOne()為靜態同步方法,一個number對象,打印? // two 3s后打印 one * 6.修改兩個方法均為靜態同步方法,一個number對象,打印?// 3s 后打印 one two * 7.修改getOne()為靜態同步方法,getTwo()為非靜態同步方法 ,兩個number,一個調用one,一個調用two //two 3s后打印 one * 8.兩個都改為靜態同步方法,兩個number 一個調用getOne(),一個調用getTwo() //3s 后打印 one two * @author Administrator * */ public class TestThread8Monitor { public static void main(String[] args) { final Number number = new Number(); final Number number2 = new Number(); new Thread(new Runnable(){ @Override public void run() { number.getOne(); } }).start(); new Thread(new Runnable(){ @Override public void run() { number2.getTwo(); } }).start(); /*new Thread(new Runnable() { @Override public void run() { number.getThree(); } }).start();*/ } } class Number{ public static synchronized void getOne(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one"); } public static synchronized void getTwo(){ System.out.println("two"); } public void getThree(){ System.out.println("three"); } }
某一時刻只有一個對象持有鎖,不管有多少個方法,其他線程都無法持有鎖
線程八鎖的關鍵:
1.非靜態方法的鎖默認為this,靜態方法的鎖為對應的Class 實例(類的字節碼)。
2.某一時刻內,只能有一個線程持有鎖,無論幾個方法。
