1. 程式人生 > >用synchronized和lock實現迴圈列印AB

用synchronized和lock實現迴圈列印AB

以前一直對多執行緒這一塊很模糊,平時工作中也很少用到(技術太渣),閒來無事就寫了一下面試經常會讓手寫的迴圈列印。

兩個執行緒中傳入了同一個物件,所以如果一個執行緒加鎖之後,另一個執行緒就不可以訪問該物件所擁有的所有同步方法,就是用這種思想,實現了下面的迴圈列印。

1、用Lock實現

package com.cn;

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

public class LockTest {
	Lock lock = new ReentrantLock();
	Condition c1 = lock.newCondition();
	int status = 1;
	public static void main(String[] args) {
		LockTest lockTest = new LockTest();
		Run1 r1 = new Run1(lockTest);
		Run2 r2 = new Run2(lockTest);
		new Thread(r1).start();
		new Thread(r2).start();

	}
	
	static class Run1 implements Runnable{
		private LockTest lockTest;
		public Run1(LockTest lockTest) {
			this.lockTest = lockTest;
		}
		@Override
		public void run() {
			for (int i = 0; i < 5; i++) {
				lockTest.printA();
			}
		}
	}
	
	static class Run2 implements Runnable{
		private LockTest lockTest;
		public Run2(LockTest lockTest) {
			this.lockTest = lockTest;
		}
		@Override
		public void run() {
			for (int i = 0; i < 5; i++) {
				lockTest.printB();
			}
		}
	}
	
	public void printA() {
		try {
			lock.lock();
			while (status != 1) {
				try {
					c1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("A");
			status = 2;
			c1.signal();
		} finally {
			lock.unlock();
		}
	}
	public void printB() {
		try {
			lock.lock();
			while (status != 2) {
				try {
					c1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("B");
			status = 1;
			c1.signal();
		} finally {
			lock.unlock();
		}
	}

}

2、用synchronized實現

package com.cn;

public class ThreadTest {
	private int status = 1;
	
	public static void main(String[] args) {
		ThreadTest t = new ThreadTest();
		ThreadOne t1 = new ThreadOne(t);
		ThreadTwo t2 = new ThreadTwo(t);
		new Thread(t1, "thread1").start();
		new Thread(t2, "thread2").start();
	}
	
	static class ThreadOne implements Runnable{
		private ThreadTest threadTest;
		public ThreadOne(ThreadTest threadTest) {
			this.threadTest = threadTest;
		}
		
		@Override
		public void run() {
			for (int i = 0; i < 5; i++) {
				threadTest.printA();
			}
		}
	}
	
	static class ThreadTwo implements Runnable{
		private ThreadTest threadTest;
		public ThreadTwo(ThreadTest threadTest) {
			this.threadTest = threadTest;
		}
		
		@Override
		public void run() {
			for (int i = 0; i < 5; i++) {
				threadTest.printB();
			}
		}
	}
	
	public void printA(){
		synchronized (this) {
			while (status != 1) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("A");
			status = 2;
			this.notifyAll();
		}
	}
	public void printB(){
		synchronized (this) {
			while (status != 2) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("B");
			status = 1;
			this.notifyAll();
		}
	}
}

輸出結果為:


相關推薦

synchronizedlock實現迴圈列印AB

以前一直對多執行緒這一塊很模糊,平時工作中也很少用到(技術太渣),閒來無事就寫了一下面試經常會讓手寫的迴圈列印。兩個執行緒中傳入了同一個物件,所以如果一個執行緒加鎖之後,另一個執行緒就不可以訪問該物件所擁有的所有同步方法,就是用這種思想,實現了下面的迴圈列印。1、用Lock實

Java多執行緒--三個執行緒分別列印a,b,c.請多執行緒實現迴圈列印15次abc

掃盲: 想想自己多執行緒解決生產消費者問題就知道個synchronized,真是慚愧 為做此題目特意學習新的多執行緒知識–ReentrantLock跟synchronized一樣都是Java中的可重入鎖(可以在內部鎖中拿到外部鎖) Con

java實現迴圈列印堆型數字

目標和效果 輸入一個數,得到一個堆型的輸出 如 輸入7 程式碼 private static void funtion(int a) { int a1 = a; for (int i = 1; i <= a; i++) { for (int j = a1 -

synchronizedlock實現原理

本文轉載自http://wenku.baidu.com/view/41480552f01dc281e53af090.html?re=view 目前在Java中存在兩種鎖機制:synchronized和Lock,Lock介面及其實現類是JDK5增加的內容,其作者是大名鼎鼎

迴圈神經網路教程第四部分-PythonTheano實現GRU/LSTM迴圈神經網路

作者:徐志強 連結:https://zhuanlan.zhihu.com/p/22371429 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本篇教程的程式碼在Github上。這裡是迴圈神經網路教程的最後一部分,前幾部分別是: 本篇中我們將學習LSTM(長短項記憶)網路和G

JAVA synchronizedlock實現原理

目前在Java中存在兩種鎖機制:synchronized和Lock,Lock介面及其實現類是JDK5增加的內容,其作者是大名鼎鼎的併發專家Doug Lea。本文並不比較synchronized與Lock孰優孰劣,只是介紹二者的實現原理。 資料同步需要依賴鎖,那鎖的同步又依賴誰?synchronized

synchronizedLOCK實現

Lock和synchronized        JDK1.5以後,在鎖機制方面引入了新的鎖-Lock,在網上的說法都比較籠統,結合網上的資訊和我的理解這裡做個總結。       java現有的鎖機制有兩種實現方式,J.DK1.4前是通過synchronized實現,J

迴圈神經網路教程 第四部分 Python Theano實現GRU/LSTM RNN

在本文中,我們將瞭解LSTM(長期短期記憶體)網路和GRU(門控迴圈單元)。 LSTM是1997年由Sepp Hochreiter和JürgenSchmidhuber首次提出的,是當下最廣泛使用的NLP深度學習模型之一。 GRU,首次在2014年使用,是一個

AnkoKotlin實現Android上的對話框警告提示(KAD 24)

posit eve linear 免費 clas testing size uil 如何 作者:Antonio Leiva 時間:Mar 9, 2017 原文鏈接:https://antonioleiva.com/dialogs-android-anko-kotlin/

css3canvas實現的蜂窩動畫效果

image() all nim 自己 clas 函數 顯示 var 不兼容 近期工作時研究了一下css3動畫和js動畫。主要是工作中為了增強頁面的趣味性,大家都有意無意的加入了非常多動畫效果。當然大部分都是css3動畫效果。能夠gpu加速,這會降低移動端的性能需求。 今

jQueryJson實現Ajax異步請求

登錄 iter() pat pass dtd tran java encoding find 這裏有兩個例子,一個是關於登錄驗證的,一個是異步加載數據的 1、regist.jsp <%@ page language="java" import="java.util.

synchronized lock 的區別

lock interrupt 責任 結合 err 順序 導致 超時時間 定義 lock更靈活,可以自由定義多把鎖的加鎖解鎖順序(synchronized要按照先加的後解順序) 提供多種加鎖方案,lock 阻塞式, trylock 無阻塞式, lockInterruptily

bisbic實現位級操作

www. -c fff 最簡 規則 bool 異或 -s 生成 轉載於 https://www.cnblogs.com/tlnshuju/p/7102021.html 20世紀70年代末至80年代末,DigitalEquipment的VAX計算機是一種非常流行的機型。

【深度學習系列】PaddlePaddleTensorflow實現經典CNN網絡GoogLeNet

mage eat oba card fin filter mod 一個 lec   前面講了LeNet、AlexNet和Vgg,這周來講講GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在2014年的論文《Going Deepe

【深度學習系列】PaddlePaddleTensorflow實現GoogLeNet InceptionV2/V3/V4

targe 所有 conn ride 出了 prev 縮減 tro 例如   上一篇文章我們引出了GoogLeNet InceptionV1的網絡結構,這篇文章中我們會詳細講到Inception V2/V3/V4的發展歷程以及它們的網絡結構和亮點。 GoogLeNet I

Synchronizedlock的區別用法

等等 name log 括號 下使用 沒有 pos nal 輕量級 一、synchronized和lock的用法區別 (1)synchronized(隱式鎖):在需要同步的對象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號中表示需要鎖的

ffmpegSDL2實現linux player

rec null sizeof open type error yuv text idt 一、version 1#include <stdio.h> #include <libavcodec/avcodec.h> #include <lib

25.jsjquery實現下拉列表的左右選擇

select2 hit color nts -type utf ctype block 標簽 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x

synchronizedlock比較

ide ads 能力 nal reads throw 很多 訪問 aqs 一、synchronized的實現方案   1.synchronized能夠把任何一個非null對象當成鎖,實現由兩種方式:   a.當synchronized作用於非靜態方法時,鎖住的是當前對象的事

HTMLCSS實現點擊內容顯示再點擊隱藏

str har ctu box 點擊 實現 aep anti 實現思路 實現思路: 1.display:none,隱藏元素;點擊時display:black; 2.設置隱藏元素高度為0,overflow:hidden;點擊時overflow:visible; 由於第一條只能