執行緒的建立方式以及synchronize的使用

revres發表於2020-07-01

執行緒的兩種建立方式

  • 繼承 Thread

    class Thr extends Thread {
       @Override
       public void run() {
           Thread.currentThread().setName("bbb");
           System.out.println(Thread.currentThread().getName());
      }
    }
  • 實現 runnable介面

    class TT implements Runnable {
       @Override
       public void run() {
           System.out.println(Thread.currentThread().getName());
      }
    }
  • 執行執行緒

    public static void main(String[] args) {
           new Thr().start();
           new Thread(new TT(),"thread").start();
      }

     

synchronized 的使用

理解synchronized 的加鎖原理.

package concurrent01.c000;

public class T {

   private Integer count = 10;

   public void run() {
       
       for (int i = 0; i < 10; i++) {
               count --;
           System.out.println(Thread.currentThread().getName() +"thread name is"+count);
  }
}
   
}

多個執行緒執行run()方法的時候,確保count的值每次只被一個執行緒修改.有四種方式

  1. 使用volatile關鍵字修飾

    private volatile static Integer count = 10;
  2. 使用synchronized關鍵字,給程式碼上鎖

    package concurrent01.c000;

    public class T {

       private Integer count = 10;

       private  Object o = new Object();

       public void t1() {

           synchronized(o){
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
    }
       
    }
  3. 可以將o替代成this.

    public void t1() {
           synchronized(this){
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
  4. 也可以在方法上面加鎖,這種方法和第三鍾方式完全等效,程式碼在執行的時候,可以看成是一種方式

    package concurrent01.c000;

    public class T {
       private volatile  Integer count = 10;
       public synchronized  void t1() {
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
    }

    synchronized 在執行一段程式碼的時候,需要給一個物件加鎖.

    執行過程

    執行緒執行程式碼塊,發現synchronized,查詢鎖物件

    鎖物件頭空間有一個markdown標識,如果是00,說明這段程式碼還沒有加鎖,執行緒拿到程式碼的執行權,並給鎖物件markdown標識設定為01,加鎖.

    其他執行緒執行到這裡的時候,去檢視鎖物件的標識,發現是01,說明這段程式碼已經加鎖,進入等待狀態.

    拿到鎖的執行緒,執行完成之後,將鎖物件的標識設定為00,即解鎖

相關文章