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

如何實現(xiàn)Java線程安全問題

 更新時間:2019年12月27日 10:10:09   作者:糖不甜,鹽不咸  
這篇文章主要介紹了如何實現(xiàn)Java線程安全問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了如何實現(xiàn)Java線程安全問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

解決線程安全問題的第一種方案:使用同步代碼塊

格式:

  synchronized(鎖對象) {

    可能會出現(xiàn)線程安全問題的代碼(訪問了共享數(shù)據(jù)的代碼)

  }

注意:代碼塊中的鎖對象,可以是任意對象,但必須保證多個線程之間使用的是同一個

鎖對象的作用是把同步代碼塊鎖住,同一時間只能讓一個線程在同步代碼塊中執(zhí)行

package com.fgy.demo02;

/**
 * 實現(xiàn)賣票案例
 */
public class RunnableImpl implements Runnable {
  private int ticket = 100;
  Object obj = new Object();

  @Override
  public void run() {
    while (true) {
      synchronized (obj) {
        if (ticket > 0) {
          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票");
          ticket--;
        }
      }
    }
  }
}
package com.fgy.demo02;

public class Demo01Ticket {
  public static void main(String[] args) {
    RunnableImpl run = new RunnableImpl();
    new Thread(run).start();
    new Thread(run).start();
    new Thread(run).start();
  }
}

解決線程安全問題的第二種方案:使用同步方法

使用步驟:

   1.把訪問了共享數(shù)據(jù)的代碼抽取出來,放到一個方法中

   2.在方法上添加synchronized修飾符

格式:

  修飾符 synchronized 返回值類型 方法名(...) {

    可能會出現(xiàn)線程安全問題的代碼(訪問了共享數(shù)據(jù)的代碼)

  }

同步方法的鎖對象是:this

靜態(tài)同步方法的鎖對象不能是this,因為this是創(chuàng)建對象后產(chǎn)生的,靜態(tài)方法優(yōu)先于對象

靜態(tài)方法的鎖對象是本類的class文件對象

package com.fgy.demo03;

/**
 * 實現(xiàn)賣票案例
 */
public class RunnableImpl implements Runnable {
  private int ticket = 100;

  @Override
  public void run() {
    while (true) {
      payTicket();
    }
  }

  public synchronized void payTicket() {
    if (ticket > 0) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票");
      ticket--;
    }
  }
}

解決線程安全問題的第三種方案:使用lock鎖

使用步驟:

   1.在成員位置創(chuàng)建ReenterantLock對象

   2.在可能出現(xiàn)安全問題的代碼前調用Lock接口中的方法lock()獲取鎖

   3.在可能出現(xiàn)安全問題的代碼后調用Lock接口中的方法unlock()釋放鎖

package com.fgy.demo04;

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

/**
 * 實現(xiàn)賣票案例
 */
public class RunnableImpl implements Runnable {
  private int ticket = 100;
  Lock l = new ReentrantLock();

  /*@Override
  public void run() {
    while (true) {
      l.lock();

      if (ticket > 0) {
        try {
          Thread.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票");
        ticket--;
      }

      l.unlock();
    }
  }*/

  @Override
  public void run() {
    while (true) {
      l.lock();

      if (ticket > 0) {
        try {
          Thread.sleep(100);
          System.out.println(Thread.currentThread().getName() + "正在買第" + ticket + "張票");
          ticket--;
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          // 無論程序是否發(fā)生異常都會釋放鎖
          l.unlock();
        }
      }
    }
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解Mybatis-plus(MP)中CRUD操作保姆級筆記

    詳解Mybatis-plus(MP)中CRUD操作保姆級筆記

    本文主要介紹了Mybatis-plus(MP)中CRUD操作保姆級筆記,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 最常用的1000個Java類(附代碼示例)

    最常用的1000個Java類(附代碼示例)

    這篇文章主要介紹了最常用的1000個Java類(附代碼示例),需要的朋友可以參考下
    2015-04-04
  • Java分治法與二分搜索算法實例分析

    Java分治法與二分搜索算法實例分析

    這篇文章主要介紹了Java分治法與二分搜索算法,簡單講述了分治法與二分搜索算法的原理并結合java實例分析了二分搜索算法的實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-11-11
  • 面向對象和面向過程的區(qū)別(動力節(jié)點java學院整理)

    面向對象和面向過程的區(qū)別(動力節(jié)點java學院整理)

    很多朋友不清楚面向對象和面向過程有什么區(qū)別,接下來小編給大家整理了關于面向對象和面向過程的區(qū)別講解,感興趣的朋友可以參考下
    2017-04-04
  • Spring Cloud升級最新Finchley版本的所有坑

    Spring Cloud升級最新Finchley版本的所有坑

    這篇文章主要介紹了Spring Cloud升級最新Finchley版本的所有坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • springboot中引入日志文件生成的配置詳解

    springboot中引入日志文件生成的配置詳解

    本文主要介紹了springboot中引入日志文件生成的配置詳解,包括日志級別的設置、日志格式的配置以及日志輸出的位置等,從而幫助開發(fā)者更好地進行開發(fā)與調試
    2023-10-10
  • java基礎的詳細了解第五天

    java基礎的詳細了解第五天

    這篇文章對Java編程語言的基礎知識作了一個較為全面的匯總,在這里給大家分享一下。需要的朋友可以參考,希望能給你帶來幫助
    2021-08-08
  • SpringBoot整合定時任務之實現(xiàn)Scheduled注解的過程(一個注解全解決)

    SpringBoot整合定時任務之實現(xiàn)Scheduled注解的過程(一個注解全解決)

    這篇文章主要介紹了SpringBoot整合定時任務之實現(xiàn)Scheduled注解的過程(一個注解全解決),本文通過使用場景分析給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解SpringIOC容器相關知識

    詳解SpringIOC容器相關知識

    這篇文章主要記錄自己在狂神說java中的學習情況,文章里有自己學習的理解和擴展,新手難免有理解偏差或者錯誤,懇請大佬指正下,需要的朋友可以參考下
    2021-05-05
  • 阿里云OSS域名配置及簡單上傳的示例代碼

    阿里云OSS域名配置及簡單上傳的示例代碼

    這篇文章主要介紹了阿里云OSS域名配置及簡單上傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論