1. 程式人生 > >java多執行緒解決同步問題的幾種方式、原理和程式碼

java多執行緒解決同步問題的幾種方式、原理和程式碼

生產者類:

publicclassProducerextendsThread{// 每次生產的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicProducer(Storage storage){this.storage = storage;}// 執行緒run函式publicvoid run(){
          produce(num);}// 呼叫倉庫Storage的生產函式publicvoid produce(int num){
          storage.produce(num);}publicint
getNum(){return num;}publicvoid setNum(int num){this.num = num;}publicStorage getStorage(){return storage;}publicvoid setStorage(Storage storage){this.storage = storage;}}

消費者類:

publicclassConsumerextendsThread{// 每次消費的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicConsumer(Storage
storage){this.storage = storage;}// 執行緒run函式publicvoid run(){ consume(num);}// 呼叫倉庫Storage的生產函式publicvoid consume(int num){ storage.consume(num);}// get/set方法publicint getNum(){return num;}publicvoid setNum(int num){this.num = num;}publicStorage getStorage(){return storage;}publicvoid setStorage
(Storage storage){this.storage = storage;}}

倉庫類:(wait()/notify()方法)

publicclassStorage{// 倉庫最大儲存量privatefinalint MAX_SIZE =100;// 倉庫儲存的載體privateLinkedList<Object> list =newLinkedList<Object>();// 生產num個產品publicvoid produce(int num){// 同步程式碼段synchronized(list){// 如果倉庫剩餘容量不足while(list.size()+ num > MAX_SIZE){//相當於緩衝區滿,生產者則等待System.out.print("【要生產的產品數量】:"+ num);System.out.println(" 【庫存量】:"+ list.size()+" 暫時不能執行生產任務!");try{
                         list.wait();// 由於條件不滿足,生產阻塞}catch(InterruptedException e){
                         e.printStackTrace();}}// 生產條件滿足情況下,生產num個產品for(int i =1; i <= num;++i){
                    list.add(newObject());}System.out.print("【已經生產產品數】:"+ num);System.out.println(" 【現倉儲量為】:"+ list.size());

               list.notifyAll();}}// 消費num個產品publicvoid consume(int num){// 同步程式碼段synchronized(list){// 如果倉庫儲存量不足while(list.size()< num){//相當於緩衝區空,消費者則等待System.out.print("【要消費的產品數量】:"+ num);System.out.println(" 【庫存量】:"+ list.size()+" 暫時不能執行生產任務!");try{// 由於條件不滿足,消費阻塞
                         list.wait();}catch(InterruptedException e){
                         e.printStackTrace();}}// 消費條件滿足情況下,消費num個產品for(int i =1; i <= num;++i){
                    list.remove();}System.out.print("【已經消費產品數】:"+ num);System.out.println(" 【現倉儲)量為】:"+ list.size());

               list.notifyAll();}}// get/set方法publicLinkedList<Object> getList(){return list;}publicvoid setList(LinkedList<Object> list){this.list = list;}publicint getMAX_SIZE(){return MAX_SIZE;}}

相關推薦

java執行解決同步問題的方式原理程式碼

生產者類: publicclassProducerextendsThread{// 每次生產的產品數量privateint num;// 所在放置的倉庫privateStorage storage;// 建構函式,設定倉庫publicProducer(Storage storage){this.stora

JAVA執行實現的方式及簡單示例

 JAVA多執行緒的實現方式是JAVA基礎的一個重點,看過好多次,但不經常用就容易忘記,今天做一個總結,算是把JAVA基礎再夯實一下。 Java多執行緒實現方式主要有四種:繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來

Java執行有哪實現方式? Java中的類如何保證執行安全? 請說明ThreadLocal的用法適用場景(面試題)

Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景 Java多執行緒有三種實現方式: (1)繼承Thread類,重寫run函式 (2)實現Runnable介面,重寫run函式 開啟執行緒:Thread t

java執行通訊的方式(II)

1.如何讓兩個執行緒嫩能夠交叉執行 要讓執行緒能夠交叉執行,需要用到鎖。看如下程式碼: package Test;/** /** * @author Administrator wangtao * @createdate 2017-10-10 */ public class

Java執行建立的三方式與對比

一、繼承Thread類建立執行緒類 1、定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體代表了執行緒需要完成的任務,即執行緒的執行體。 2、建立Thread子類的例項,即建立執行緒物件。 3、呼叫執行緒物件的start()方法來啟動該執行緒

Java 執行下,2安全效能靠譜的單例模式

懶漢式-雙重核驗: package com.zzf.concurrence.singleinstance; /** * 懶漢式-雙重核驗 * @author zzf * */ public class SingleEHan { private Single

JAVA執行實現的四方式

         昨天自己用ExecutorService建立執行緒池做穿透測試了一下,感覺挺有意思,所以又好好的看了一下執行緒的問題,在此轉載了一篇博友的文章,感覺總結的不錯,所以分享一下. Java多執行緒實現方式主要有四種: 繼承Thread類、實現Runnable

JAVA執行實現的三方式及內部原理

JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完

JAVA執行實現的三方式

JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。 1、繼承Thread類實現多

java--(執行建立的兩方式Thread類Runnable介面)

(一)繼承Thread類建立多執行緒----單執行緒下面的程式碼是一個死迴圈,但是不會執行main裡面的迴圈語句,而是run()裡面的語句,這是因為該程式是一個單執行緒程式,當呼叫MyThread類的run()方法時,遇到死迴圈,迴圈一直進行。因此,MyThread類的列印

JAVA執行實現的3方式

JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。 1、繼承Thread類實

JAVA執行實現的三方式(繼承Thread類實現Runnable介面使用ExecutorServiceCallableFuture實現有返回結果的執行)

JAVA多執行緒實現方式 JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。

java執行實現的兩方式

java自帶主要有兩種實現多執行緒的方式。第一種:繼承執行緒類Thread,重新run的方法。第二種:實現介面Runnable,重新run方法。我先不說明他們的區別。先看程式碼的實現。第一種方式:public class MyThread extends Thread { 

Java執行之AQS(AbstractQueuedSynchronizer )實現原理原始碼分析(三)

章節概覽、 1、回顧 上一章節,我們分析了ReentrantLock的原始碼: 2、AQS 佇列同步器概述 本章節我們深入分析下AQS(AbstractQueuedSynchronizer)佇列同步器原始碼,AQS是用來構建鎖或者其他同步元件的基礎框架。

JAVA執行概念及其實現方法優劣分析

1. 多執行緒 程式:指令集,靜態的概念 程序:作業系統調動程式,是程式的一次動態執行過程,動態的概念 執行緒:在程序內的多條執行路徑 Ps:單核的話程序都是虛擬模擬出來的,多核處理器才可以執行真正的多執行緒 單核通過CPU排程時間片實現虛擬模擬的多執行緒,比如執行main函式和GC在底層就是多執行

Java執行學習(十):AQS 原理以及 AQS 同步元件總結

常見問題:AQS 原理?;CountDownLatch和CyclicBarrier瞭解嗎,兩者的區別是什麼?用過Semaphore嗎? 本節思維導圖: 阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms

python中執行開啟的兩方式(內含有event的應用,即安全的機制,類似於java的等待喚醒機制,不會出現執行之間的錯亂問題)

 event是類似於java中的等待喚醒機制,具體方法參照上一篇CSDN 下面來介紹開啟執行緒的第一種方式 #Filename:threading1.py #開啟執行緒的第一種方式 import threading import time event=threadin

Java學習筆記(一) Java執行 synchronized同步方法

1.提出問題-例項變數非執行緒安全 如果多個執行緒同時訪問1個物件的例項變數,則可能出現"非執行緒安全"問題。 1.1 何為非執行緒安全? 我的理解是多個執行緒對一個例項變數操作會出現值被更改,不同步的情況。 1.2 舉例 1.2.1 有私有變數的類HasPr

Java學習筆記(二) Java執行 synchronized同步方法-防止髒讀

1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName =

Java執行同步機制(synchronized)

原文地址 一段synchronized的程式碼被一個執行緒執行之前,他要先拿到執行這段程式碼的許可權,在 java裡邊就是拿到某個同步物件的鎖(一個物件只有一把鎖); 如果這個時候同步物件的鎖被其他執行緒拿走了,他(這個執行緒)就只能等了(執行緒阻塞在鎖池 等待佇列中)。 取到鎖後,他就開始執行同步程式碼