最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 線程同步詳解

 更新時(shí)間:2016年03月24日 10:35:59   作者:趙杰A-124  
這篇文章主要給大家詳細(xì)介紹的是Java 線程同步的相關(guān)問題及代碼示例,有需要的小伙伴可以參考下

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) {
    //多線程實(shí)現(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時(shí)并不會讓出資源鎖。

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) {
    //實(shí)現(xiàn)順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
    
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
  }

}

同步方法是使用synchronized關(guān)鍵字修飾的某個方法,同步方法鎖定的就是該對象本身,所以當(dāng)一個線程調(diào)用了某個對象的同步方法后,如有其它線程調(diào)用該對象的其它同步方法,也依然要等待釋放該對象的鎖,因?yàn)樵搶ο笠驯绘i定。

3、同步鎖

通過定義同步鎖對象實(shí)現(xiàn)同步,這種情況下,同步鎖使用Lock對象充當(dāng)。

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) {
    //實(shí)現(xiàn)順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
        
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
  }

}

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

相關(guān)文章

  • 如何使用MybatisPlus的SQL注入器提升批量插入性能

    如何使用MybatisPlus的SQL注入器提升批量插入性能

    本文給大家介紹如何使用MybatisPlus的SQL注入器提升批量插入性能,以實(shí)戰(zhàn)視角講述如何利用該特性提升MybatisPlus?的批量插入性能,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 如何為Logback日志添加唯一追蹤ID

    如何為Logback日志添加唯一追蹤ID

    本文介紹了如何為Logback日志添加唯一追蹤ID,以便在測試和調(diào)試時(shí)更容易定位報(bào)錯信息,通過創(chuàng)建過濾器和修改配置文件,可以在每個請求的日志中添加唯一的ID,并將其返回給前端,這樣,當(dāng)用戶反饋報(bào)錯時(shí),開發(fā)人員可以根據(jù)ID快速定位和解決問題
    2024-12-12
  • 舉例講解Java的內(nèi)部類與類的加載器

    舉例講解Java的內(nèi)部類與類的加載器

    這篇文章主要介紹了Java的內(nèi)部類與類的加載器,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-03-03
  • Java實(shí)現(xiàn)簡單學(xué)生管理系統(tǒng)

    Java實(shí)現(xiàn)簡單學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java多態(tài)中動態(tài)綁定原理解析

    Java多態(tài)中動態(tài)綁定原理解析

    這篇文章主要介紹了Java多態(tài)中動態(tài)綁定原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 最新評論

    辽阳市| 河津市| 即墨市| 南澳县| 合江县| 五峰| 乐清市| 攀枝花市| 兰州市| 新干县| 菏泽市| 会泽县| 兴安县| 巴楚县| 紫阳县| 锡林郭勒盟| 改则县| 乌拉特后旗| 济源市| 邻水| 隆回县| 台南县| 蒙自县| 原阳县| 五指山市| 洛隆县| 墨竹工卡县| 子长县| 汉阴县| 怀宁县| 施秉县| 崇州市| 通州区| 沁阳市| 泸西县| 巴彦淖尔市| 临潭县| 盖州市| 安庆市| 云南省| 南昌县|