1. 程式人生 > >多執行緒-同步程式碼塊解決執行緒安全問題的解釋以及同步的特點及好處和弊端

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


package cn.itcast_10;

public class SellTicket implements Runnable {

	// 定義100張票
	private int tickets = 100;

	// 定義同一把鎖
	private Object obj = new Object();

	@Override
	public void run() {
		while (true) {
			// t1,t2,t3都能走到這裡
			// 假設t1搶到CPU的執行權,t1就要進來
			// 假設t2搶到CPU的執行權,t2就要進來,發現門是關著的,進不去。所以就等著。
			// 門(開,關)
			synchronized (obj) { // 發現這裡的程式碼將來是會被鎖上的,所以t1進來後,就鎖了。(關)
				if (tickets > 0) {
					try {
						Thread.sleep(100); // t1就睡眠了
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "張票 ");
					//視窗1正在出售第100張票
				}
			} //t1就出來可,然後就開門。(開)
		}
	}
}


package cn.itcast_10;

/*
 * 舉例:
 * 		火車上廁所。
 * 
 * 同步的特點:
 * 		前提:
 * 			多個執行緒
 *		解決問題的時候要注意:
 *			多個執行緒使用的是同一個鎖物件
 * 同步的好處 
 *		同步的出現解決了多執行緒的安全問題。
 * 同步的弊端
 *		當執行緒相當多時,因為每個執行緒都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程式的執行效率。
 */
public class SellTicketDemo {
	public static void main(String[] args) {
		// 建立資源物件
		SellTicket st = new SellTicket();

		// 建立三個執行緒物件
		Thread t1 = new Thread(st, "視窗1");
		Thread t2 = new Thread(st, "視窗2");
		Thread t3 = new Thread(st, "視窗3");

		// 啟動執行緒
		t1.start();
		t2.start();
		t3.start();
	}
}

相關推薦

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

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

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

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

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

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

33-多執行緒--賣票示例+執行緒安全(產生原因+解決方式:同步)+同步同步程式碼塊+同步的好處與弊端+同步的前提+同步函式+賣票示例的同步函式寫法+驗證同步函式的鎖+驗證靜態同步函式的鎖)

一、賣票示例 需求:四個視窗,同時售賣100張票,票號為1-100 1、沒有多執行緒時的賣票程式碼 class Ticket { //100張票 private int num = 100; public void sale() { /

java 執行synchronized鎖同步方法,同步程式碼

執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部

javaSE (三十五)執行執行實現方法區別、同步程式碼方法(執行安全))

主要還是熟悉api,熟悉方法,簡單,需要多實踐 1、 多執行緒實現方法和區別: 多執行緒實現的兩種方法: 1)類繼承Thread類或實現Runnable介面,重寫run()方法 2)建立Thread的子類物件(需要開幾個執行緒就建立幾個物件,可建立匿名內部類) 3)子類

-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O

 本文關鍵詞: java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖  sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中 多執行緒

Java第十三天學習筆記~執行執行的狀態、建立執行的第二種方式、同步程式碼同步函式)

                                 多執行緒 執行緒的狀態 CPU的執行資格:可以被C

執行併發問題以及單例設計模式與執行安全以及同步方法同步程式碼

執行緒安全和非執行緒安全 在作業系統中,執行緒是不擁有資源的,程序擁有資源。執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享程序中的資源。當多個執行緒同時操作一個變數時,這個時候就可能會造成資料的不一致性,此時就是執行緒不安全。 JVM有主記

執行,兩種實現方式(繼承Thread,實現Runnable介面),設定獲取名字,同步程式碼、方法,死鎖

1.多執行緒的引入(瞭解) 1.什麼是執行緒 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作 2.多執行緒的應用場景 紅蜘蛛同時共享螢幕給多個電腦 迅雷開啟多條執行緒一起下載 Q

執行】synchronized同步程式碼

一、前言        使用synchronized宣告的方法在 某些情況下是有弊端的,比如A執行緒呼叫同步的方法執行一個長時間的任務,那麼B執行緒就必須等待比較長的時間才能執行,這種情況可以使用synchronized程式碼塊去優化程式碼執行時間,也就是通常所說的減少鎖的

Java執行同步同步程式碼、wait、notify與notifyAll的真正含義與工作原理

今天在和導師討論Java多執行緒程式設計的同步問題時,發現自己對同步程式碼塊、wait()方法、notify()方法和notifyAll()方法的理解不太清晰,於是在網上查閱資料,可是結果眾說紛紜,又在

Java執行6 中同步函式的鎖同步程式碼的鎖的區別

同步程式碼塊的出現是解決了多執行緒的安全問題,但是它增加了程式碼的縮排層級,同時降低了效率(每次無論是不是對的鎖,每個路徑都要去判斷) 針對同步出現的這兩個問題,首先討論第一個。因此引出一個新的知識點———————— 同步函式 關於同步函式的使用(一買車票的程式碼為例子

執行五:synchronized同步程式碼

使用synchronized的弊端A執行緒呼叫同步方法執行一個長時間的任務,那麼B執行緒則必須等待比較長時間。synchronized同步程式碼塊兩個併發執行緒訪問同一個物件object中synchro

執行同步程式碼的兩種方法

程式碼塊同步public void print2(){ synchronized (this) { System.out.print("w"); System.out.print("o"); System.out.print("r"); Sy

基本執行同步(五)使用Lock同步程式碼

宣告:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González     譯者:許巧輝 校對:方騰飛 使用Lock同步程式碼塊 Java提供另外的機制用來同步程式碼塊。它比synchronized關鍵字更加強大、靈活

java 執行 (三)執行併發的安全性 同步程式碼

  package cn.sasa.demo1; import java.util.concurrent.ExecutionException; public class ThreadDemo { public static void main(String[] args) th

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

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

執行中的同步程式碼synchronized、同步方法同步鎖Lock

在學習執行緒的時候,因為執行緒的排程具有不確定性,所以銀行取錢問題、多個視窗售賣火車票問題都是反應多執行緒的優越性以及不確定性。當程式中有多個併發執行緒在進入一個程式碼塊中並且修改其中引數時,就很有可能引發執行緒安全問題從而造成異常。 同步程式碼塊 所以,j

執行同步 synchronized 同步程式碼 同步方法 同步

一 同步程式碼塊 1.為了解決併發操作可能造成的異常,java的多執行緒支援引入了同步監視器來解決這個問題,使用同步監視器的通用方法就是同步程式碼塊。其語法如下: synchronized(obj){ //同步程式碼塊 } 其中obj就是同步監視器,它的含義是:執行