在面試中你可能遇到過(guò)這樣的問(wèn)題:鎖(lock)和監(jiān)視器(monitor)有什么區(qū)別?
嗯,要回答這個(gè)問(wèn)題,你必須深入理解Java的多線程底層是如何工作的。
簡(jiǎn)短的答案是,鎖為實(shí)現(xiàn)監(jiān)視器提供必要的支持。詳細(xì)答案如下。
鎖(lock)
邏輯上鎖是對(duì)象內(nèi)存堆中頭部的一部分?jǐn)?shù)據(jù)。JVM中的每個(gè)對(duì)象都有一個(gè)鎖(或互斥鎖),任何程序都可以使用它來(lái)協(xié)調(diào)對(duì)對(duì)象的多線程訪問(wèn)。如果任何線程想要訪問(wèn)該對(duì)象的實(shí)例變量,那么線程必須擁有該對(duì)象的鎖(在鎖內(nèi)存區(qū)域設(shè)置一些標(biāo)志)。所有其他的線程試圖訪問(wèn)該對(duì)象的變量必須等到擁有該對(duì)象的鎖有的線程釋放鎖(改變標(biāo)記)。
一旦線程擁有一個(gè)鎖,它可以多次請(qǐng)求相同的鎖,但是在其他線程能夠使用這個(gè)對(duì)象之前必須釋放相同數(shù)量的鎖。如果一個(gè)線程請(qǐng)求一個(gè)對(duì)象的鎖三次,如果別的線程想擁有該對(duì)象的鎖,那么之前線程需要 “釋放”三次鎖。
Java中顯示鎖的使用語(yǔ)法如下:
… private Lock bankLock = new ReentrantLock(); … public double getTotalBalance() { bankLock.lock(); try { double sum = 0; for (double a : accounts) sum += a; return sum; } finally { bankLock.unlock(); } }