程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 線程同步詳解

Java 線程同步詳解

編輯:關於JAVA

Java 線程同步詳解。本站提示廣大學習愛好者:(Java 線程同步詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 線程同步詳解正文


Java 線程同步基本上是要相符一個邏輯:加鎖------>修正------>釋放鎖

1、同步代碼塊

示例以下:

public class SyncBlock {
  static class DataWrap {
    int i;
  }
  
  static class SyncBlockThread extends Thread {
    private DataWrap date;
    
    public SyncBlockThread(DataWrap dataWrap) {
      this.date = dataWrap;
    }
    
    @Override
    public void run() {
      
      for (int i = 0; i < 10; i++) {
        synchronized (date) {
          date.i++;
          try {
            sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          System.out.println(getName() + " " + date.i);
        }
      }
    }
  }
  
  public static void main(String[] args) {
    //多線程完成變量i順次加一輸入
    DataWrap dataWrap = new DataWrap();
    
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
  }

}

示例中願望依照次序順次輸入整數。

平日同步代碼塊是須要鎖定的對象,普通是須要並發拜訪的同享資本,任何線程在修正指定資本之前都起首對該資本加鎖,在加鎖時代其它線程沒法修正該資本。從而包管了線程的平安性。別的線程在挪用sleep或許yield時其實不會讓出資本鎖。

2、同步辦法

public class SyncMethod {
  
  static class DataWrap{
    int i;
    
    public synchronized void valueGrow(){
      i++;
      
      try {
        Thread.sleep(1);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getName() + " " + i);
    }
  }
  
  static class SyncMethodThread extends Thread {
    DataWrap dataWrap;
    
    public SyncMethodThread(DataWrap dataWrap){
      this.dataWrap = dataWrap;
    }
    
    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
        dataWrap.valueGrow();  
      }
    }
  }
  
  public static void main(String[] args) {
    //完成次序增加並輸入Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
    
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
  }

}

同步辦法是應用synchronized症結字潤飾的某個辦法,同步辦法鎖定的就是該對象自己,所以當一個線程挪用了某個對象的同步辦法後,若有其它線程挪用該對象的其它同步辦法,也仍然要期待釋放該對象的鎖,由於該對象已被鎖定。

3、同步鎖

經由過程界說同步鎖對象完成同步,這類情形下,同步鎖應用Lock對象充任。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SyncLock {

  static class DataWrap{
    Lock lock = new ReentrantLock();
    int i;
    
    public void valueGrow(){
      lock.lock();
      try {
        i++;
        
        try {
          Thread.sleep(1);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " " + i);  
      } finally {
        lock.unlock();
      }
      
    }
  }
  
  static class SyncLockThread extends Thread {
    DataWrap dataWrap;
    
    public SyncLockThread(DataWrap dataWrap){
      this.dataWrap = dataWrap;
    }
    
    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
        dataWrap.valueGrow();  
      }
    }
  }
  
  public static void main(String[] args) {
    //完成次序增加並輸入Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
        
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
  }

}

應用鎖對象完成線程同步會更靈巧一些,某些鎖還具有一些特定的功效,個中比擬經常使用的ReadWriteLock讀寫鎖,ReentrantLock可重入鎖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved