線程鎖-案例

package com.iflysse.test05;
/**
* 線程的聲明週期:

新建:當一個Thread類或其子類的對象被聲明並創建時,新生的線程對象處於新建狀態

就緒:新建線程被start()後,將進入線程隊列等待cpu時間片

運行:當就緒線程被調度並獲得處理器資源時,進入運行狀態;

阻塞:某種特殊情況下,被人爲掛起,讓出cpu並臨時中止自己的執行,進入阻塞狀態

死亡:線程完成了它的全部工作,或被提前強制性的中止

    • ①線程安全問題存在的原因
      由於一個線程在操作共享數據過程中,未執行結束,另外的線程參與進來,導致共享數據存在安全問題

    ②如何解決線程的安全問題
    必須讓一個線程操作共享數據完畢以後,其它線程纔有機會參與共享數據的操作

    ③java如何實現線程安全,線程的同步機制
    1)同步代碼塊
    synchronized (同步監視器) {
    //需要被同步的代碼(即操作共享數據的代碼)
    }

  • 共享數據:多個線程共同操作的同一個數據(變量)
    同步監視器:由任何一個類的對象來充當。那個線程獲取此監視器,誰就執行共享數據

    鎖必須是唯一的
    所有的線程必須公用一把鎖!
    注:在實現的方式中,考慮同步的話,可以使用this來當鎖,但在繼承的方式中,慎用!

    • 2)同步方法
      將操作共享數據的方法聲明爲synchronizd,即此方法爲同步方法。
      能夠保證當其中一個線程執行此方法時,其他線程在外等待直至此線程執行完此方法。

    同步方法的鎖:當前對象(this)
    *


    • 小結:釋放鎖的操作
      *
  • ①當前線程的同步方法、同步代碼塊執行結束
  • ②當前線程在同步方法、同步代碼塊中遇到break/return終止了改代碼塊
  • ③當前線程在同步方法、同步代碼塊中出現了未處理的Error/Exception
  • ④當前線程在同步方法、同步代碼塊中執行了線程對象的wait()方法,當前線程暫停,並釋放鎖

    • sleep();不釋放鎖
    • 死鎖的問題

    不同的線程分別佔用對方所需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了線程的死鎖


  • 如何解決
    減少同步資源的定義

    */

    public class Day032805 {
    
        public static void main(String[] args) {
            final StringBuffer sb1 = new StringBuffer("");
            final StringBuffer sb2 = new StringBuffer("");
    
            //定義兩個線程  1 2
            //A先獲取鎖sb1  插入數據  再獲取所sb2  打印數據
            //B先獲取所sb2                  再獲取所sb1
            //定義線程1
    
            //匿名類匿名對象  1
            new Thread(){
                public void run(){
                    synchronized (sb1) {
                        sb1.append("A");
                        try {
                            Thread.currentThread().sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        synchronized (sb2) {
                            sb2.append("B");
                            System.out.println("==================");
                            System.out.println(sb1);
                            System.out.println(sb2);
                            System.out.println("==================");
                        }
                    }
                }
            }.start();
    
            //線程2
            new Thread(){
                public void run(){
    
                    synchronized (sb2) {
                        sb1.append("C");
                        try {
                            Thread.currentThread().sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        synchronized (sb1) {
                            sb2.append("D");
                            System.out.println("**********************");
                            System.out.println(sb1);
                            System.out.println(sb2);
                            System.out.println("**********************");
                        }
                    }
                }
            }.start();
        }
    }
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章