摘要:
使用非阻塞隊(duì)列的時(shí)候有一個(gè)很大問(wèn)題就是:它不會(huì)對(duì)當(dāng)前線程產(chǎn)生阻塞,那么在面對(duì)類似消費(fèi)者-生產(chǎn)者的模型時(shí),就必須額外地實(shí)現(xiàn)同步策略以及線程間喚醒策略,這個(gè)實(shí)現(xiàn)起來(lái)就非常麻煩。但是有了阻塞隊(duì)列就不一樣了,它會(huì)對(duì)當(dāng)前線程產(chǎn)生阻塞,比如一個(gè)線程從一個(gè)空的阻塞隊(duì)列中取元素,此時(shí)線程會(huì)被阻塞直到阻塞隊(duì)列中有了元
閱讀全文
摘要:
前言 在你的App中的很多地方都需要使用到數(shù)據(jù)信息,它可能是一個(gè)session token,一次費(fèi)時(shí)計(jì)算的結(jié)果等等,通常為了避免Activity之間傳遞數(shù)據(jù)的開(kāi)銷,會(huì)將這些數(shù)據(jù)通過(guò)持久化來(lái)存儲(chǔ)。 有人建議將這些數(shù)據(jù)放在Application對(duì)象中方便所有的Activity訪問(wèn),這個(gè)解決方案簡(jiǎn)單、優(yōu)雅
閱讀全文
摘要:
并發(fā)容器的簡(jiǎn)單介紹: ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),眾所周知,HashMap是根據(jù)散列值分段存儲(chǔ)的,同步Map在同步的時(shí)候鎖住了所有的段,而ConcurrentHashMap加鎖的時(shí)候根據(jù)散列值鎖
閱讀全文
摘要:
為了方便編寫(xiě)出線程安全的程序,Java里面提供了一些線程安全類和并發(fā)工具,比如:同步容器、并發(fā)容器、阻塞隊(duì)列、Synchronizer(比如CountDownLatch) 一.為什么會(huì)出現(xiàn)同步容器? 在Java的集合容器框架中,主要有四大類別:List、Set、Queue、Map。 List、Set
閱讀全文
摘要:
一.對(duì)ThreadLocal的理解 ThreadLocal,很多地方叫做線程本地變量,也有些地方叫做線程本地存儲(chǔ),其實(shí)意思差不多。可能很多朋友都知道ThreadLocal為變量在每個(gè)線程中都創(chuàng)建了一個(gè)副本,那么每個(gè)線程可以訪問(wèn)自己內(nèi)部的副本變量。 ThreadLocal類用來(lái)提供線程內(nèi)部的局部變量。
閱讀全文
摘要:
由于volatile關(guān)鍵字是與Java的內(nèi)存模型有關(guān)的,因此在講述volatile關(guān)鍵之前,我們先來(lái)了解一下與內(nèi)存模型相關(guān)的概念和知識(shí)。 一.內(nèi)存模型的相關(guān)概念 Java內(nèi)存模型規(guī)定所有的變量都是存在主存當(dāng)中,每個(gè)線程都有自己的工作內(nèi)存。線程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行,而不能直接對(duì)主存進(jìn)
閱讀全文
摘要:
一.synchronized的缺陷 synchronized是java中的一個(gè)關(guān)鍵字,也就是說(shuō)是Java語(yǔ)言內(nèi)置的特性。那么為什么會(huì)出現(xiàn)Lock呢? 在上面一篇文章中,我們了解到如果一個(gè)代碼塊被synchronized修飾了,當(dāng)一個(gè)線程獲取了對(duì)應(yīng)的鎖,并執(zhí)行該代碼塊時(shí),其他線程便只能一直等待,等待獲
閱讀全文
摘要:
一.synchronized同步方法或者同步塊 在了解synchronized關(guān)鍵字的使用方法之前,我們先來(lái)看一個(gè)概念:互斥鎖,顧名思義:能到達(dá)到互斥訪問(wèn)目的的鎖。 舉個(gè)簡(jiǎn)單的例子:如果對(duì)臨界資源加上互斥鎖,當(dāng)一個(gè)線程在訪問(wèn)該臨界資源時(shí),其他線程便只能等待。 在Java中,每一個(gè)對(duì)象都擁有一個(gè)鎖標(biāo)記
閱讀全文
摘要:
一.線程的狀態(tài) 線程從創(chuàng)建到最終的消亡,要經(jīng)歷若干個(gè)狀態(tài)。一般來(lái)說(shuō),線程包括以下這幾個(gè)狀態(tài):創(chuàng)建(new)、就緒(runnable)、運(yùn)行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。 當(dāng)需要新起一個(gè)線程來(lái)執(zhí)行某個(gè)子任務(wù)時(shí),就創(chuàng)建了一個(gè)線程。
閱讀全文
摘要:
在多線程的應(yīng)用中,兩個(gè)或者兩個(gè)以上的線程需要共享對(duì)同一個(gè)數(shù)據(jù)的存取。如果兩個(gè)線程存取相同的對(duì)象,并且每一個(gè)線程都調(diào)用了修改該對(duì)象的方法,這種情況通常成為競(jìng)爭(zhēng)條件。 競(jìng)爭(zhēng)條件最容易理解的例子就是:比如火車賣票,火車票是一定的,但賣火車票的窗口到處都有,每個(gè)窗口就相當(dāng)于一個(gè)線程,這么多的線程共用所有的火
閱讀全文