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

Java線程同步實例分析

 更新時間:2015年07月20日 11:19:46   作者:鑒客  
這篇文章主要介紹了Java線程同步用法,實例分析了java中線程同步的相關(guān)實現(xiàn)技巧與注意事項,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了Java線程同步的用法。分享給大家供大家參考。具體分析如下:

多線程的使用為我們的程序提供了眾多的方便,同時它也給我們帶來了以往沒有考慮過的麻煩。當(dāng)我們使用多線程處理共享資源時意外將會發(fā)生:比如我們一起外出就餐,每個人都是一個線程,餐桌上的食物則是共享資源,當(dāng)我看到紅燒雞腿上桌后立即拿起筷子直奔目標(biāo),眼看著就得手的時候,突然~~~雞腿消失了,一個距離盤子更近的線程正在得意地啃著。

為了避免上述問題的發(fā)生,Java為我們提供了“synchronized(同步化)修飾符”來避免資源沖突,你可以將資源類中某個函數(shù)或變量聲明為synchronized(同步化),每個繼承自O(shè)bject的類都含有一個機鎖(Lock),它是余生俱來的,不需要編寫任何代碼來啟用它。當(dāng)我們調(diào)用任何synchronized(同步化)函數(shù)時,該對象將被鎖定,對象中所有 synchronized(同步化)函數(shù)便無法被調(diào)用,直到第一個函數(shù)執(zhí)行完畢并解除機鎖。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
 * 線程同步
 * 我們模擬一個銀行存儲過程來證明線程同步的必要性以及在Java中進行線程同步的方法
 * 重點:synchronized 修飾符
 */
public class TestMain5 extends JFrame {
 private MyAccounts myAccounts = null; // 我的帳號
 private JTextField text = null; // 銀行存款數(shù)額顯示
 private JTextArea textArea = null; // 交易過程顯示
 private JButton button = null; // 開始模擬交易的按鈕
 /**
  * 構(gòu)造一個銀行存取款界面
  */
 public TestMain5(){
  super("線程同步測試");
  myAccounts = new MyAccounts();
  text = new JTextField(Integer.toString(myAccounts.inquire()), 10); // 我們在銀行中的初始存款為100
  textArea = new JTextArea();
  textArea.setText("交易日志:");
  JScrollPane sp = new JScrollPane(textArea);
  button = new JButton("開始交易");
  button.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    new Bank("鐘樓支行", myAccounts, Bank.DEAL_SAVING, 800);
    new Bank("高新支行", myAccounts, Bank.DEAL_SAVING, 1300);
    new Bank("小寨支行", myAccounts, Bank.DEAL_FETCH, 200);
    new Bank("雁塔支行", myAccounts, Bank.DEAL_FETCH, 400);
    new Bank("興慶支行", myAccounts, Bank.DEAL_SAVING, 100);
    new Bank("土門支行", myAccounts, Bank.DEAL_FETCH, 700);
   }
  });
  JPanel pane = new JPanel();
  pane.add(text);
  pane.add(button);
  this.getContentPane().add(pane, BorderLayout.NORTH);
  this.getContentPane().add(sp);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setSize(300, 200);
  this.setLocationRelativeTo(null);
  this.setVisible(true);
 }
 /**
  * 銀行交易大廳類
  * 一般銀行都會有N個交易大廳,這些大廳可以同時處理多筆業(yè)務(wù),這正好符合多線程的特點
  */
 class Bank extends Thread{
  /**
   * 靜態(tài)字段:用于表示儲存
   */
  public static final int DEAL_SAVING = 0;
  /**
   * 靜態(tài)字段:用于表示提取
   */
  public static final int DEAL_FETCH = 1;
  private int buy = Bank.DEAL_FETCH; // 默認使取款
  private int count = 0;
  private MyAccounts myAccounts = null; // 我的帳號
  /**
   * 構(gòu)造這個銀行交易大廳
   * @param name 這個交易大廳的名稱
   * @param myAccounts 我的銀行帳號
   * @param buy 行為,參考字段:DEAL_SAVING或DEAL_FETCH
   * @param count 錢的數(shù)量
   */
  public Bank(String name, MyAccounts myAccounts, int buy, int count){
   super(name);
   this.myAccounts = myAccounts;
   this.buy = buy;
   this.count = count;
   this.start();
  }
  public void run(){
   int $count = 0;
   if(buy == Bank.DEAL_SAVING){ // 如果是存款業(yè)務(wù)
    $count = myAccounts.saving(count);
   }else if(buy == Bank.DEAL_FETCH){ // 如果是取款業(yè)務(wù)
    $count = myAccounts.fetch(count);
   }
   text.setText(Integer.toString($count));
   textArea.append("\n" + this.getName() + " " + (buy == Bank.DEAL_SAVING ? "存款": "取款") + " 金額:" + count + " 結(jié)余:" + $count);
  }
 }
 /**
  * 我的帳號
  * 進行同步測試
  */
 class MyAccounts{
  private Integer count = 1100;
  public MyAccounts(){
  }
  /**
   * 查詢我的帳號
   */
  public int inquire(){
   synchronized (count){
    return count;
   }
  }
  /**
   * 存款業(yè)務(wù)
   * @param c 存款的數(shù)量
   * @return 業(yè)務(wù)辦理完成后的數(shù)量
   */
  public int saving(int c){
   synchronized (count){
    //return count += c; // 為了能更好的觀察,我們將這個簡潔的語句注釋掉
    int $count = inquire(); // 先查詢帳戶中的存款
    $count += c;
    try {
     Thread.sleep(1000); // 為了更好的觀察,使業(yè)務(wù)在此停頓1秒鐘
    } catch (InterruptedException ex) {
     ex.printStackTrace();
    }
    count = $count; // 最后將總數(shù)儲存起來
    return inquire(); // 返回最新的存款數(shù)
   }
  }
  /**
   * 取款業(yè)務(wù)
   * @param c 取款的數(shù)量
   * @return 業(yè)務(wù)辦理完成后的數(shù)量
   */
  public int fetch(int c){
   synchronized (count){
    //return count -= c; // 為了能更好的觀察,我們將這個簡潔的語句注釋掉
    int $count = inquire(); // 先查詢帳戶中的存款
    $count -= c;
    try {
     Thread.sleep(1000); // 為了更好的觀察,使業(yè)務(wù)在此停頓1秒鐘
    } catch (InterruptedException ex) {
     ex.printStackTrace();
    }
    count = $count; // 最后將總數(shù)儲存起來
    return inquire(); // 返回最新的存款數(shù)
   }
  }
 }
 public static void main(String [] args){
  new TestMain5();
 }
}

希望本文所述對大家的java程序設(shè)計有所幫助。

相關(guān)文章

  • Java 連接Access數(shù)據(jù)庫的兩種方式

    Java 連接Access數(shù)據(jù)庫的兩種方式

    這篇文章主要介紹了Java 連接Access數(shù)據(jù)庫的兩種方式,本文著重講解使用JDBC連接操作Access數(shù)據(jù)庫,需要的朋友可以參考下
    2015-06-06
  • 在SpringBoot項目中的使用Swagger的方法示例

    在SpringBoot項目中的使用Swagger的方法示例

    這篇文章主要介紹了在SpringBoot項目中的使用Swagger的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • SpringBoot的依賴管理配置

    SpringBoot的依賴管理配置

    一般來講SpringBoot項目是不需要指定版本,而SSM項目是需要指定版本,SpringBoot的核心依賴就是spring-boot-starter-parent和spring-boot-starter-web兩個依賴,關(guān)于這兩個依賴的相關(guān)介紹具體今天小編給大家介紹下
    2022-07-07
  • Spring?Boot應(yīng)用程序中如何使用Keycloak詳解

    Spring?Boot應(yīng)用程序中如何使用Keycloak詳解

    這篇文章主要為大家介紹了Spring?Boot應(yīng)用程序中如何使用Keycloak詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 項目為什么引入log4j而不是logback代碼

    項目為什么引入log4j而不是logback代碼

    這篇文章主要介紹了項目為什么引入log4j而不是logback代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Java SQL注入案例教程及html基礎(chǔ)入門

    Java SQL注入案例教程及html基礎(chǔ)入門

    這篇文章主要介紹了前端開發(fā)每天必學(xué)之SQL及HTML入門基礎(chǔ)知識,介紹了學(xué)習(xí)web前端開發(fā)需要掌握的基礎(chǔ)技術(shù),感興趣的小伙伴們可以參考一下
    2021-07-07
  • MapStruct Plus的使用教程

    MapStruct Plus的使用教程

    MapStruct和MapStructPlus是Java類型映射的工具,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽

    詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽

    這篇文章主要介紹了詳解SpringCloud eureka服務(wù)狀態(tài)監(jiān)聽,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Springboot如何切換默認的Tomcat容器

    Springboot如何切換默認的Tomcat容器

    這篇文章主要介紹了Springboot如何切換默認的Tomcat容器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • springboot 返回json格式數(shù)據(jù)時間格式配置方式

    springboot 返回json格式數(shù)據(jù)時間格式配置方式

    這篇文章主要介紹了springboot 返回json格式數(shù)據(jù)時間格式配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

秀山| 博爱县| 永顺县| 茌平县| 仙游县| 灌南县| 古蔺县| 凉山| 通化县| 岳阳县| 云阳县| 左云县| 阳原县| 鹤岗市| 舟山市| 江达县| 礼泉县| 福贡县| 阿坝| 北辰区| 郓城县| 泗水县| 忻城县| 武汉市| 望谟县| 武穴市| 龙泉市| 阿拉善右旗| 冷水江市| 烟台市| 柘荣县| 土默特右旗| 内黄县| 时尚| 陇南市| 上饶市| 东宁县| 临漳县| 梁山县| 永宁县| 永和县|