多線(xiàn)程隊(duì)列不加鎖有什么后果 不使用synchronized和lock,如何實(shí)現(xiàn)一個(gè)線(xiàn)程安全的單例?
不使用synchronized和lock,如何實(shí)現(xiàn)一個(gè)線(xiàn)程安全的單例?在多線(xiàn)程操作系統(tǒng)中,如果不使用同步和鎖定,就想不出更好的方法來(lái)實(shí)現(xiàn)安全的單例。即使是互斥或臨界區(qū)技術(shù)也只是一種偽裝的鎖定機(jī)制。但是
不使用synchronized和lock,如何實(shí)現(xiàn)一個(gè)線(xiàn)程安全的單例?
在多線(xiàn)程操作系統(tǒng)中,如果不使用同步和鎖定,就想不出更好的方法來(lái)實(shí)現(xiàn)安全的單例。即使是互斥或臨界區(qū)技術(shù)也只是一種偽裝的鎖定機(jī)制。但是,從另一個(gè)角度來(lái)看,一個(gè)單例無(wú)論如何只有一個(gè)實(shí)體對(duì)象,它占用的系統(tǒng)資源(通常是內(nèi)存)不會(huì)太大。因此,可以采用預(yù)先生成的解決方案,即在程序初始化過(guò)程中很好地生成單例對(duì)象,從而避免了運(yùn)行中多線(xiàn)程競(jìng)爭(zhēng)的問(wèn)題。
什么時(shí)候需要分布式鎖?
首先,我們需要知道在非分布式環(huán)境中使用鎖可以解決什么問(wèn)題?
多線(xiàn)程環(huán)境,共享資源線(xiàn)程安全問(wèn)題!此時(shí),共享資源通常在一臺(tái)機(jī)器的多線(xiàn)程中競(jìng)爭(zhēng)。從JAVA內(nèi)存模型的角度來(lái)看,我們可以通過(guò)鎖定對(duì)象、方法和代碼塊來(lái)避免共享資源的競(jìng)爭(zhēng)
!1,生成全局ID;
2,修改全局配置文件;
3,分布式服務(wù)中的seckill;
4,分布式環(huán)境中的重復(fù)提交;
1,使用數(shù)據(jù)庫(kù)的唯一主鍵實(shí)現(xiàn)鎖定
!2、使用redis指令:通常使用setnx方法,incr方法實(shí)現(xiàn)
3、使用zookeeper:使用API生成臨時(shí)節(jié)點(diǎn)實(shí)現(xiàn)鎖定!