1. 程式人生 > >架構師入門筆記六 初識執行緒安全鎖

架構師入門筆記六 初識執行緒安全鎖

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class UseManyCondition {

	private ReentrantLock lock = new ReentrantLock();
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	
	public void m1(){
		try {
			lock.lock();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "進入方法m1等待..");
			c1.await();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "方法m1繼續..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m2(){
		try {
			lock.lock();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "進入方法m2等待..");
			c1.await();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "方法m2繼續..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m3(){
		try {
			lock.lock();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "進入方法m3等待..");
			c2.await();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "方法m3繼續..");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m4(){
		try {
			lock.lock();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "喚醒..");
			c1.signalAll();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void m5(){
		try {
			lock.lock();
			System.out.println("當前執行緒:" +Thread.currentThread().getName() + "喚醒..");
			c2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public static void main(String[] args) {
		
		final UseManyCondition umc = new UseManyCondition();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m1();
			}
		},"t1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m2();
			}
		},"t2");
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m3();
			}
		},"t3");
		Thread t4 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m4();
			}
		},"t4");
		Thread t5 = new Thread(new Runnable() {
			@Override
			public void run() {
				umc.m5();
			}
		},"t5");
		
		t1.start();	// c1
		t2.start();	// c1
		t3.start();	// c2
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t4.start();	// c1
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		t5.start();	// c2
	}
	
}
程式碼摘錄網路,t1 ,t2執行緒 處於c1的等待中,t3執行緒處於c2的等待中。t4執行緒負責喚醒全部c1的等待執行緒。t5執行緒負責喚醒t3執行緒。可以從列印的結果中清晰看出

相關推薦

架構入門筆記 初識執行安全

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class UseManyCondition { private ReentrantLock lock

架構入門筆記初識IO NIO AIO

import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.

Java資深架構詳解大廠多執行面試題,細談併發程式設計深造歷程

  多執行緒、執行緒池 多執行緒是實現併發機制的一種有效手段。程序和執行緒一樣,都是實現併發的一個基本單位。執行緒是比程序更小的執行單位,執行緒是程序的基礎之上進行進一步的劃分。所謂多執行緒是指一個程序在執行過程中可以產生多個更小的程式單元,這些更小的單元稱為執行緒,這

P7架構帶你深入瞭解執行的發展歷史

  專題簡介 作為一個合格的Java程式設計師,必須要對併發程式設計有一個深層次的瞭解,在很多網際網路企業都會

學習筆記之Java執行安全雜談(上)——執行安全概念和基本方案

執行緒安全問題絕對是併發開發中一個重點中的重點,這篇就來說說執行緒安全相關的一些問題。執行緒安全是什麼概念?這個概念說簡單也簡單,說複雜也複雜,“安全”的概念是什麼,用我個人的話說的淺顯些,就是類/物件本身在多執行緒併發執行的場景下,能夠保證程式的邏輯是可以接受的而不是被

執行安全的單例模式

單例模式怕是很多程式設計師使用最多的設計模式了,面向物件的23種設計模式點這裡。廢話不多說,直接上程式碼: public class Singleton { //1.懶漢型 privat

jvm筆記07:執行安全優化

 java語言中的執行緒安全         按照執行緒安全的”安全程度”由強至弱來排序,我們可以將java語言中各種操作共享的資料分為以下5類:不可變、絕對執行緒安全、相對執行緒安全、執行緒相容和執行緒對立 不可變          不可變的的物件一定是執行緒安全的。無論

iOS 執行安全--

一,前言   執行緒安全是iOS開發中避免了的話題,隨著多執行緒的使用,對於資源的競爭以及資料的操作都可能存在風險,所以有必要在操作時保證執行緒安全。 二,為什麼要使用鎖?      由於一個程序中不可避免的存在多執行緒,所以不可避免的存在多個執行緒訪問同一個資料的情況。但

執行安全-機制 synchronized用法同步方法

一個簡單的例子,10個人搶8張票,結果肯定是有2個人搶不到票的 public class Ticket { private static CountDownLatch ctl =new CountDownLatch(1); private Reentra

要點提煉| 理解JVM之執行安全&優化

本篇將介紹執行緒安全所涉及的概念和分類、同步實現的方式及虛擬機器的底層運作原理,以及虛擬機器為了實現高效併發所採取的一系列鎖優化措施。 概述 執行緒安全 鎖優化 1.概述 在要點提煉| 理解JVM之記憶體模型&執行緒中主要介紹了虛擬機

基於Netty3的RPC架構筆記3之執行模型原始碼分析

      隨著使用者量上升,專案的架構也在不斷的升級,由最開始的MVC的垂直架構(傳統專案)到RPC架構(webservice,rest,netty,mina),再到SOA模型(dubbo),再到最近的微服務,又比如Tomcat6之前的IO模型都是BIO 也就是阻塞IO,

90%的程式設計師,都沒用過多執行,怎麼成為架構

![](https://img-blog.csdnimg.cn/20201207105047668.jpg) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) Github:[https://github.com/fuzhengwei/CodeGuid

多研究些架構,少談些框架——一名阿裏架構筆記

pos 不同的 還原 don eva art 同步 限制 it行業 微服務架構和SOA區別 微服務現在辣麽火,業界流行的對比的卻都是所謂的Monolithic單體應用,而大量的系統在十幾年前都是已經是分布式系統了,那麽微服務作為新的理念和原來的分布式系統,或者說SOA(面向

百度微服務架構隨手筆記:教你如何手寫Docker

names lar 朋友 -i oot 封裝 路由 必須 spa 模擬Docker實現一個簡單的容器,不到 200行代碼(包括空行、註釋、異常處理),這並不是吹牛B。容器技術幾乎是Linux kernel內置的模塊,我們簡單調用一下API就能搞定很多事情。當然你要考慮各種商

二、執行安全阻塞佇列 BlockingQueue 入門

一、BlockingQueue繼承關係 java.util.concurrent 包裡的 BlockingQueue是一個介面, 繼承Queue介面,Queue介面繼承 Collection BlockingQueue --> Queue –-> Collection

【Java筆記】多執行實現簡單的非同步運算

實現Callable介面,重寫call()方法,使操作執行緒池時能帶有返回值的效果: import java.util.concurrent.Callable; public class GetSumCallable implements Callable<Integer> {

執行安全問題(迸發)入門知識總結

關於Java解決執行緒衝突的方法簡單總結 1.在方法面前使用synchronized或者使用方法塊 2.使用各種鎖lock,Reentrantlock,讀寫鎖 3.使用volatile保證可見性 4.使用ThreadLock複製變數副本 5.java.util.concurrent的API及St

Android進階(十)子執行呼叫Toast報Can't create handler inside thread that has not called Looper.prepare() 錯誤

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

《CLR Via C#》讀書筆記:26.執行基礎

一、執行緒開銷 作業系統建立執行緒是有代價的,其主要開銷在下面列舉出來了。 記憶體開銷 執行緒核心物件 擁有執行緒描述屬性與執行緒上下文,執行緒上下文佔用的記憶體空間為 x86 架構 佔用 700 位元組、x64 架構 1240 位元組 、ARM 架構 350 位元組。

架構入門:Spring Cloud系列,Hystrix與Eureka的整合

    和Ribbon等元件一樣,在專案中,Hystrix一般不會單獨出現,而是會和Eureka等元件配套出現。在Hystrix和Eureka整合後的框架裡,一般會用到Hystrix的斷路器以及合併請求等特性,而在Web框架裡,大多會有專門的快取元件,所以不怎麼會用到Hystri