1. 程式人生 > >多執行緒——引入同步程式碼塊解決視窗賣票產生負票的問題

多執行緒——引入同步程式碼塊解決視窗賣票產生負票的問題

/**
 * 通過畫圖分析,分析上一篇博文中錯票產生的原因:
 * 已經判斷為票數了,執行緒被阻塞了,先一次被切換到不需要判斷了。
 * 區域性變數不會出現數字錯亂的現象,而成員變數會出現陣列出現負數的現象。
 * 
 * 安全的問題產生的原因:
 * 1.多個執行緒在操作共享資料。
 * 2.操作共享資料的程式碼有多條。
 * 
 * 一個執行緒在執行多條操作共享資料的過程當中,其他執行緒參與的運算,這時就會產生安全問題。
 * 
 * 想要分析執行緒當中是否有安全問題?
 * 依據:執行緒任務當中有沒有共享的資料,該資料是否被多條語句操作。
 * 
 * 這個安全問題的解決方案?
 * 只要保證一個執行緒在執行多條共享資料的語句時,其他的執行緒不能參與運算即可。
 * 當該執行緒執行完之後,其他執行緒在來處理這個語句。
 * 
 * 程式碼體現:
 *    java給我們提供了具體的程式碼:就是同步程式碼塊。
 *    格式:synchronized(物件){    //這個物件可以是任意的物件
 *            //需要被同步執行的語句
 *        }
 *
 * 同步的原理:其實就是將需要同步的程式碼進行了封裝,然後在將封裝的程式碼塊之上加了一把鎖。
 * 
 * 同步的好處:解決了多執行緒的安全問題。
 * 同步的弊端:會降低效能。
 * 
 * 一種現象,出現了多執行緒的安全性問題,為了解決加了同步,發現問題依舊,產生這個現象的原因是什麼?
 * 
 * 同步的前提
 * 1.必須要保證同步中有多個執行緒,因為同步中只有一個執行緒這個同步是沒有任何意義的。
 *   還需要注意把共享資料的多條程式碼都放在同步程式碼塊當中。
 * 2.必須要保證多執行緒在同步中使用的是同一把鎖。
 * 
 * */


package com.work.wor01;

class Ticket1 implements Runnable{
	private int num = 100;
	Object obj = new Object();
	@Override
	public void run() {
		while(true){
			synchronized (obj) {//同步程式碼塊 , 解決了因為下面兩行sleep()產生的產生負票問題。
				if(num>0){
					try {
//					在指定的毫秒數加指定的納秒數內讓當前正在執行的執行緒休眠(暫停執行)會產生負數票
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"...sale"+num--);
				}else{
					break;
				}
			}
			
		}
	}
} 

public class ThreadTicket02 {
	public static void main(String[] args) {
		Ticket1 t = new Ticket1();
		//Thread類的物件和Thread類的子類的物件都是執行緒的物件。
		//但是t並不是執行緒的物件。
		//向四個執行緒當中傳入的是同一個t物件,是因為執行緒執行的是同樣的任務。
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

相關推薦

執行——引入同步程式碼解決視窗產生的問題

/** * 通過畫圖分析,分析上一篇博文中錯票產生的原因: * 已經判斷為票數了,執行緒被阻塞了,先一次被切換到不需要判斷了。 * 區域性變數不會出現數字錯亂的現象,而成員變數會出現陣列出現負數

執行——用同步程式碼解決經典儲戶銀行存錢問題

package com.work.wor01; /** * 需求:有兩個儲戶同時到一個銀行去存錢,每人存3次,每次存100元。 * 要求打印出銀行每次金額的變化情況(假設銀行沒錢) * *

JAVA#執行'同步程式碼 札記

public static void main(String[] args) { Shixian s1=new Shixian(); Thread t1=new Thread(s1); t1.setName("宋小艾"); t1.st

執行-同步程式碼解決執行安全問題的解釋以及同步的特點及好處和弊端

package cn.itcast_10; public class SellTicket implements Runnable { // 定義100張票 private int tick

方法快解決執行同步安全問題,以及其中鎖的問題

package cn.itcast.demo1; /* 採用同步方法形式,解決執行緒的安全問題 好處: 程式碼簡潔 將執行緒共享資料,和同步,抽取到一個方法中 在方法的宣告上,加入同步關鍵字 問題: 同步方法有鎖嗎,肯定有,同步方法中的物件鎖

程式碼說話:synchronized關鍵字和執行訪問同步方法的7種情況

synchronized關鍵字在多執行緒併發程式設計中一直是元老級角色的存在,是學習併發程式設計中必須面對的坎,也是走向Java高階開發的必經之路。 一、synchronized性質 synchronized是Java提供的內建鎖機制,有如下兩種特性: 互斥性:即在同一時間最多隻有一個執行緒能持有這種鎖。當

PYTHON——執行同步鎖:Lock

一、先用一個例子說明沒有用鎖的時候,達到的效果錯誤: 1、例項(沒有鎖的情況): import time import threading # 沒有用鎖的 # 時候,出現多個執行緒拿到相同資源的現象。 # 如下例中,共享資源變數num=100,我們開100個執行緒,每個執行緒將資源變數num減1,按

執行同步鎖 加鎖和執行停止

一.同步程式碼塊(同步鎖) 寫法: synchronized(鎖){ 上鎖的程式碼 } 當執行緒進入同步程式碼塊 會把鎖拿走 執行程式碼塊中的程式碼 程式碼執行完畢後 會把鎖還回去 如果執行緒遇到同步程式碼塊 發現沒有鎖 將進入等待(有鎖才可進) 鎖的注意:保證所有執行緒使用的是同一個鎖

Python進階(二十六)-執行實現同步的四種方式

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(二十六)-多執行緒實現同步的四種方式

執行深入學習及面試解決思路

課程目標 執行緒與程序區別 為什麼要使用多執行緒? 多執行緒應用場景? 多執行緒建立方式 獲取執行緒物件以及名稱 守護執行緒 多執行緒執行狀態 join()方法作用 多執行緒分批處理資料 作業題 面試題 備註單詞 執行緒與程序區別

執行,執行同步互斥

程序:只是分配資源的單位 , 不執行指令(是而靠執行緒執行指令)執行緒 (#include<pthread.h>)  (Thread輕量級的程序):程序內部的一條執行路徑(俗稱程序的輕量級) 主執行緒:每一個程序必須有一個預設執行緒,稱為主執行緒(執行主函式) 執

Python 執行程序 (二)之 執行同步、通訊

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高

執行第五課——執行引發的問題及解決方案

  這節課我們來學習下多執行緒可能引發的問題以及解決方法     先來看一個小例子: public class MultiThreadDemo {     public static void main(String[]

7. 執行併發相關問題和解決技巧

一. 如何使用多執行緒 實際案例 https://intrinio.com/tutorial/web_api 我們通過上述網站提供的API獲取了股市資訊的CSV資料, 現在要下載大量CSV資料檔案, 並將其轉化為xml檔案 如何使用執行緒來提高下載並處理的效率? 解決方案

[Xcode10 實際操作]八、網路與執行-(23)執行同步與非同步的區別

本文將演示執行緒的同步與非同步的區別。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 非同步執行緒的執行,是沒有按照順序執行的。 1 import UIKit 2 3 class ViewController: UIViewController

水滴石穿--執行安全同步與鎖

什麼是執行緒安全? 當多個執行緒訪問某一個類(物件或方法)時,這個物件始終都能表現出正確的行為, 那麼這個類(物件或方法)就是執行緒安全的。 java記憶體模型  在說明多執行緒安全問題前,要明白java記憶體模型。 為什麼有執行緒安全問題? 當多個執行緒同時共享

執行安全同步程式碼

public class RunnableTest implements Runnable { private int tick = 60; @Override public void run() { while (true) { syn

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 =

執行死鎖程式碼

public class DeadLock { //建立兩個物件,一個執行緒持有鎖A並且申請獲得鎖B,而另一個執行緒持有鎖B並且申請獲得鎖A就會發生死鎖。 private static final Object A=new Object(); priv