欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 線程同步詳解

 更新時間:2016年03月24日 10:35:59   作者:趙杰A-124  
這篇文章主要給大家詳細介紹的是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) {
    //多線程實現(xiàn)變量i依次加一輸出
    DataWrap dataWrap = new DataWrap();
    
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
  }

}

示例中希望按照順序依次輸出整數(shù)。

通常同步代碼塊是需要鎖定的對象,一般是需要并發(fā)訪問的共享資源,任何線程在修改指定資源之前都首先對該資源加鎖,在加鎖期間其它線程無法修改該資源。從而保證了線程的安全性。另外線程在調(diào)用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) {
    //實現(xiàn)順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
    
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
  }

}

同步方法是使用synchronized關鍵字修飾的某個方法,同步方法鎖定的就是該對象本身,所以當一個線程調(diào)用了某個對象的同步方法后,如有其它線程調(diào)用該對象的其它同步方法,也依然要等待釋放該對象的鎖,因為該對象已被鎖定。

3、同步鎖

通過定義同步鎖對象實現(xiàn)同步,這種情況下,同步鎖使用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) {
    //實現(xiàn)順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
        
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
  }

}

使用鎖對象實現(xiàn)線程同步會更靈活一些,某些鎖還具有一些特定的功能,其中比較常用的ReadWriteLock讀寫鎖,ReentrantLock可重入鎖。

相關文章

  • java實現(xiàn)學生信息錄入界面

    java實現(xiàn)學生信息錄入界面

    這篇文章主要為大家詳細介紹了java實現(xiàn)學生信息錄入界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java編程異常簡單代碼示例

    Java編程異常簡單代碼示例

    這篇文章主要介紹了Java編程異常簡單代碼示例,還是比較不錯的,這里分享個大家,需要的朋友可以參考下。
    2017-11-11
  • Java中替代equals,compareTo和toString的方法

    Java中替代equals,compareTo和toString的方法

    這篇文章主要介紹了Java中替代equals,compareTo和toString的方法,文中代碼十分詳細,幫助大家更好的理解的學習,感興趣的朋友可以了解下
    2020-06-06
  • 在編碼時如何使用\r與\n,兩者的區(qū)別

    在編碼時如何使用\r與\n,兩者的區(qū)別

    本篇文章是對\r與\n兩者的區(qū)別,以及編程語言中如何使用進行了詳細的分析介紹,需要的朋友可以參考下
    2015-07-07
  • Spring Boot集成Druid查看配置是否生效的方法

    Spring Boot集成Druid查看配置是否生效的方法

    本文主要介紹了Spring Boot集成Druid查看配置是否生效的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 解決java.net.SocketTimeoutException: Read timed out的問題

    解決java.net.SocketTimeoutException: Read timed out的問題

    這篇文章主要介紹了解決java.net.SocketTimeoutException: Read timed out的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 關于解決雪花算法生成的ID傳輸前端后精度丟失問題

    關于解決雪花算法生成的ID傳輸前端后精度丟失問題

    這篇文章主要介紹了關于解決雪花算法生成的ID傳輸前端后精度丟失問題,雪花算法生成的ID傳輸?shù)角岸藭r,會出現(xiàn)后三位精度丟失,本文提供了解決思路,需要的朋友可以參考下
    2023-03-03
  • java讀寫串口數(shù)據(jù)你了解多少

    java讀寫串口數(shù)據(jù)你了解多少

    這篇文章主要為大家詳細介紹了java讀寫串口數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 使用socket實現(xiàn)網(wǎng)絡聊天室和私聊功能

    使用socket實現(xiàn)網(wǎng)絡聊天室和私聊功能

    這篇文章主要介紹了使用socket實現(xiàn)網(wǎng)絡聊天室和私聊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • spring動態(tài)注冊bean?AOP失效原理解析

    spring動態(tài)注冊bean?AOP失效原理解析

    這篇文章主要為大家介紹了spring動態(tài)注冊bean使AOP失效原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論