多執行緒——引入同步程式碼塊解決視窗賣票產生負票的問題
/** * 通過畫圖分析,分析上一篇博文中錯票產生的原因: * 已經判斷為票數了,執行緒被阻塞了,先一次被切換到不需要判斷了。 * 區域性變數不會出現數字錯亂的現象,而成員變數會出現陣列出現負數的現象。 * * 安全的問題產生的原因: * 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