用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(); } } }
輸出結果為:
相關推薦
用synchronized和lock實現迴圈列印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 -
synchronized和lock的實現原理
本文轉載自http://wenku.baidu.com/view/41480552f01dc281e53af090.html?re=view 目前在Java中存在兩種鎖機制:synchronized和Lock,Lock介面及其實現類是JDK5增加的內容,其作者是大名鼎鼎
迴圈神經網路教程第四部分-用Python和Theano實現GRU/LSTM迴圈神經網路
作者:徐志強 連結:https://zhuanlan.zhihu.com/p/22371429 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本篇教程的程式碼在Github上。這裡是迴圈神經網路教程的最後一部分,前幾部分別是: 本篇中我們將學習LSTM(長短項記憶)網路和G
JAVA synchronized和lock的實現原理
目前在Java中存在兩種鎖機制:synchronized和Lock,Lock介面及其實現類是JDK5增加的內容,其作者是大名鼎鼎的併發專家Doug Lea。本文並不比較synchronized與Lock孰優孰劣,只是介紹二者的實現原理。 資料同步需要依賴鎖,那鎖的同步又依賴誰?synchronized
synchronized和LOCK的實現
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年使用,是一個
用Anko和Kotlin實現Android上的對話框和警告提示(KAD 24)
posit eve linear 免費 clas testing size uil 如何 作者:Antonio Leiva 時間:Mar 9, 2017 原文鏈接:https://antonioleiva.com/dialogs-android-anko-kotlin/
用css3和canvas實現的蜂窩動畫效果
image() all nim 自己 clas 函數 顯示 var 不兼容 近期工作時研究了一下css3動畫和js動畫。主要是工作中為了增強頁面的趣味性,大家都有意無意的加入了非常多動畫效果。當然大部分都是css3動畫效果。能夠gpu加速,這會降低移動端的性能需求。 今
用jQuery和Json實現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
用bis和bic實現位級操作
www. -c fff 最簡 規則 bool 異或 -s 生成 轉載於 https://www.cnblogs.com/tlnshuju/p/7102021.html 20世紀70年代末至80年代末,DigitalEquipment的VAX計算機是一種非常流行的機型。
【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡GoogLeNet
mage eat oba card fin filter mod 一個 lec 前面講了LeNet、AlexNet和Vgg,這周來講講GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在2014年的論文《Going Deepe
【深度學習系列】用PaddlePaddle和Tensorflow實現GoogLeNet InceptionV2/V3/V4
targe 所有 conn ride 出了 prev 縮減 tro 例如 上一篇文章我們引出了GoogLeNet InceptionV1的網絡結構,這篇文章中我們會詳細講到Inception V2/V3/V4的發展歷程以及它們的網絡結構和亮點。 GoogLeNet I
Synchronized和lock的區別和用法
等等 name log 括號 下使用 沒有 pos nal 輕量級 一、synchronized和lock的用法區別 (1)synchronized(隱式鎖):在需要同步的對象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號中表示需要鎖的
用ffmpeg和SDL2實現linux player
rec null sizeof open type error yuv text idt 一、version 1#include <stdio.h> #include <libavcodec/avcodec.h> #include <lib
25.用js和jquery實現下拉列表的左右選擇
select2 hit color nts -type utf ctype block 標簽 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x
synchronized和lock比較
ide ads 能力 nal reads throw 很多 訪問 aqs 一、synchronized的實現方案 1.synchronized能夠把任何一個非null對象當成鎖,實現由兩種方式: a.當synchronized作用於非靜態方法時,鎖住的是當前對象的事
用HTML和CSS實現點擊內容顯示再點擊隱藏
str har ctu box 點擊 實現 aep anti 實現思路 實現思路: 1.display:none,隱藏元素;點擊時display:black; 2.設置隱藏元素高度為0,overflow:hidden;點擊時overflow:visible; 由於第一條只能