摘要:進(jìn)入方法線程停止關(guān)鍵字雖然擁有多個(gè)線程之間的可見(jiàn)性,但是卻不具備原子性關(guān)鍵字用于針對(duì)多個(gè)線程可變的變量操作,但是不能替代關(guān)鍵字的同步功能。
volatile關(guān)鍵字的作用是變量在多個(gè)線程之間可見(jiàn)
volatile的作用是強(qiáng)制線程到主內(nèi)存(共享內(nèi)存)里讀取變量,而不是線程工作內(nèi)存區(qū)里去讀取變量,從而實(shí)現(xiàn)了多個(gè)線程之間的變量可見(jiàn),也就是滿足線程安全的可見(jiàn)性。
private volatile boolean isRunning = true; private void setRunning(boolean isRunning){ this.isRunning = isRunning; } public void run(){ System.out.println("進(jìn)入run方法.."); int i = 0; while(isRunning == true){ //.. } System.out.println("線程停止"); }
volatile 關(guān)鍵字雖然擁有多個(gè)線程之間的可見(jiàn)性,但是卻不具備原子性
volatile關(guān)鍵字用于針對(duì)多個(gè)線程可變的變量操作,但是不能替代synchronized關(guān)鍵字的同步功能。
atomic類(lèi)支持原子性操作
private static AtomicInteger count = new AtomicInteger(0); /**synchronized*/ public synchronized int multiAdd(){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } count.addAndGet(1); count.addAndGet(2); count.addAndGet(3); count.addAndGet(4); //+10 return count.get(); }
多個(gè)addAndGet在一個(gè)方法內(nèi)是非原子性的,需要加synchronized進(jìn)行修飾,保證4個(gè)addAndGet整體原子性
線程通信
使用wait和notify可以實(shí)現(xiàn)線程之間的通信
wait/notify必須配合synchronized 關(guān)鍵字使用
wait釋放鎖 notify不釋放鎖
所有的object都可以使用該方法
// final Object lock = new Object(); final CountDownLatch countDownLatch = new CountDownLatch(1); Thread t1 = new Thread(new Runnable() { public void run() { //synchronized (lock) { try { //countDownLatch.countDown(); //countDownLatch.awat(); //lock.notify(); //lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //} } }, "t1");
使用wait/nofity的缺點(diǎn)是無(wú)法實(shí)現(xiàn)實(shí)時(shí)的通信 推薦使用countDownLatch 來(lái)實(shí)現(xiàn)實(shí)時(shí)的交互
使用wait/notify模擬Queue
public class MyQueue { //1 需要一個(gè)承裝元素的集合 private LinkedList
TimeUnit是java.util.concurrent包下面的一個(gè)類(lèi),TimeUnit提供了可讀性更好的線程暫停操作,通常用來(lái)替換Thread.sleep()
每次寫(xiě)一個(gè)具有設(shè)計(jì)意義的小程序 考驗(yàn)的是分析能力
ThreadLocal:
ThreadLocal 是線程局部變量 是一種多線程間 并發(fā)訪問(wèn)變量 的解決方案
ThreadLocal 完全不提供鎖,以空間換時(shí)間的方式 為每一個(gè)線程提供變量的獨(dú)立副本 以保障線程安全
private static ThreadLocalth = new ThreadLocal();
在并發(fā)量不高 的時(shí)候 ,加鎖的性能會(huì)更好
座位一套無(wú)鎖的線程安全解決方案 使用ThreadLocal可以減少所競(jìng)爭(zhēng)
單例模式+多線程
在提高性能的時(shí)候 有保證了線程安全
dubble check Instance
public class DubbleSingleton { private static DubbleSingleton ds; public static DubbleSingleton getDs(){ if(ds == null){ try { //模擬初始化對(duì)象的準(zhǔn)備時(shí)間... Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (DubbleSingleton.class) { if(ds == null){ ds = new DubbleSingleton(); } } } return ds; } }
static inner class
public class Singleton { private static class InnerSingleton { private static Singleton single = new Singleton(); } public static Singleton getInstance(){ return InnerSingleton.single; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70388.html
摘要:相比與其他操作系統(tǒng)包括其他類(lèi)系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線程的使用。很多編程語(yǔ)言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門(mén): Java多線程學(xué)習(xí)(一)Java多線程入門(mén) Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)syn...
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄业哪繕?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...
摘要:因?yàn)槎嗑€程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線程的使用。舉個(gè)例子如果說(shuō)服務(wù)器的帶寬只有,某個(gè)資源的下載速度是,系統(tǒng)啟動(dòng)個(gè)線程下載該資源并不會(huì)導(dǎo)致下載速度編程,所以在并發(fā)編程時(shí),需要考慮這些資源的限制。 最近私下做一項(xiàng)目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項(xiàng)目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門(mén): Java多線程學(xué)習(xí)(一)Java多線程入門(mén) Jav...
一:線程基礎(chǔ)知識(shí) 1.并發(fā)編程的基本概念 2. 線程的基本操作 3.線程之間的通信wait和notify 4.join和yield以及sleep詳解 5. synchronized關(guān)鍵字講解 6. volatile原理 7. 線程組 8.線程優(yōu)先級(jí) 9.守護(hù)線程 10.ThreadLocal 二:JDK并發(fā)包 1.jdk并發(fā)工具類(lèi) 重入鎖 信號(hào)量 讀寫(xiě)鎖 CountDownLatch cyclic...
摘要:本文重點(diǎn)掌握異步編程的相關(guān)概念了解期物的概念意義和使用方法了解中的阻塞型函數(shù)釋放的特點(diǎn)。一異步編程相關(guān)概念阻塞程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握異步編程的相關(guān)概念;2、了解期物future的概念、意義和使用方法;3、了解Python...
閱讀 1025·2021-11-22 13:52
閱讀 936·2019-08-30 15:44
閱讀 580·2019-08-30 15:43
閱讀 2436·2019-08-30 12:52
閱讀 3484·2019-08-29 16:16
閱讀 645·2019-08-29 13:05
閱讀 2951·2019-08-26 18:36
閱讀 2006·2019-08-26 13:46