java多線程 線程八鎖


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.某一時刻內,只能有一個線程持有鎖,無論幾個方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM