java中的非公平锁不怕有的线程一直得不到执行吗 人在一直得不到正义公平的情况,好好的人请问他失去了什么?是权...

Java\u4e2d\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u6b7b\u5faa\u73af\u6709\u4ec0\u4e48\u540e\u679c

\u6709\u4e24\u4e2a\u7ebf\u7a0b\u5728\u5e76\u53d1\u8fd0\u884c\uff0c\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u7684\u4ee3\u7801\u4e2d\u542b\u6709\u4e00\u4e2a\u6b7b\u5faa\u73af\u5982:while(true)....\u5f53\u8be5\u7ebf\u7a0b\u5728\u6267\u884cwhile(true)\u4e2d\u4ee3\u7801\u65f6\uff0c\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u4f1a\u6709\u6267\u884c\u3002\u4e00.\u793a\u4f8b\u4ee3\u7801\uff1a
\u4e8c.\u4e24\u4e2a\u7ebf\u7a0b\u7c7b\u7684\u5b9e\u73b0\u5982\u4e0b\uff1a
\u4e09.\u7ebf\u7a0bA\u6267\u884cmethodA()\uff0cmethodA()\u4e2d\u6709\u4e00\u4e2a\u6b7b\u5faa\u73af\uff1a
\u56db.\u6d4b\u8bd5\u7c7b\uff1a
\u7531\u4e8e\u7ebf\u7a0bA\u548c\u7ebf\u7a0bB\u83b7\u5f97\u7684\u5bf9\u8c61\u9501\u4e0d\u662f\u540c\u4e00\u628a\u9501\uff0c\u4ece\u7ed3\u679c\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c\u7ebf\u7a0bB\u662f\u53ef\u4ee5\u6267\u884c\u5b8c\u6210\u7684\u3002\u800c\u7ebf\u7a0bA\u7531\u4e8e\u8fdb\u5165\u4e86while\u6b7b\u5faa\u73af\uff0c\u6545\u7ebf\u7a0bA\u4e00\u76f4\u6267\u884c\u8fd0\u884c\u4e0b\u53bb\u4e86(\u6574\u4e2a\u7a0b\u5e8f\u672a\u7ed3\u675f)\uff0c\u4f46\u7ebf\u7a0bB\u4f1a\u7ed3\u675f\u3002
\u4e5f\u5c31\u662f\u8bf4\uff0c\u5c3d\u7ba1\u7ebf\u7a0bA\u4e00\u76f4\u5728while\u4e2d\u6267\u884c\uff0c\u9700\u8981\u5360\u7528CPU\u3002\u4f46\u662f\uff0c\u7ebf\u7a0b\u7684\u8c03\u5ea6\u662f\u7531JVM\u6216\u8005\u8bf4\u662f\u64cd\u4f5c\u7cfb\u7edf\u6765\u8d1f\u8d23\u7684\uff0c\u5e76\u4e0d\u662f\u8bf4\u7ebf\u7a0bA\u4e00\u76f4\u5728while\u5faa\u73af\uff0c\u7136\u540e\u7ebf\u7a0bB\u5c31\u5360\u7528\u4e0d\u5230CPU\u4e86\u3002\u5bf9\u4e8e\u7ebf\u7a0bA\u800c\u8a00\uff0c\u76f8\u5f53\u4e8e\u4e00\u4e2a\u201c\u8ba1\u7b97\u5bc6\u96c6\u578b\u201d\u4f5c\u4e1a\u4e86\u3002\u5982\u679cwhile\u5faa\u73af\u662f\u4e0d\u65ad\u5730\u6d4b\u8bd5\u67d0\u4e2a\u6761\u4ef6\u662f\u5426\u6210\u7acb\uff0c\u90a3\u4e48\u8fd9\u79cd\u65b9\u5f0f\u5c31\u5f88\u6d6a\u8d39CPU\uff0c\u53ef\u53c2\u8003\u4e00\u4e2a\u5177\u4f53\u7684\u5b9e\u4f8b\uff1aJAVA\u591a\u7ebf\u7a0b\u4e4b\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f \u4e2d\u7684\u201c\u7ebf\u7a0b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f\u201d\u7b2c\u4e8c\u70b9while\u8f6e\u8be2\u3002
\u5982\u679c\u628aService.java\u4fee\u6539\u6210\u5982\u4e0b\uff1a

\u603b\u7ed3\uff1a\u82e5\u7ebf\u7a0bA\u5148\u83b7\u5f97\u5bf9\u8c61\u9501\u65f6\uff0c\u7531\u4e8ewhile\u5faa\u73af\uff0c\u7ebf\u7a0bA\u4e00\u76f4\u5728while\u7a7a\u5faa\u73af\u4e2d\u3002\u800c\u7ebf\u7a0bB\u4e5f\u56e0\u4e3a\u65e0\u6cd5\u83b7\u5f97\u9501\u800c\u6267\u884c\u4e0d\u4e86methodB()\u3002
\u53ef\u4ee5\u770b\u51fa\uff0c\u5982\u679c\u5728\u4e00\u4e2a\u7ebf\u7a0b\u5728synchronized\u65b9\u6cd5\u4e2d\u65e0\u6cd5\u9000\u51fa\uff0c\u65e0\u6cd5\u5c06\u9501\u91ca\u653e\uff0c\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u5c31\u53ea\u80fd\u65e0\u9650\u7b49\u5f85\u4e86\u3002

\u597d\u591a\uff0c\u4e3b\u8981\u770b\u4e2a\u4eba\u60f3\u6cd5\uff0c\u4ece\u5927\u4f17\u65c1\u4eba\u773c\u5149\u770b\u4ed6\u5931\u53bb\u4e86\u6743\u5229\u4ee5\u53ca\u7ef4\u62a4\u6b63\u4e49\u7684\u529b\u91cf\u548c\u7cbe\u529b

首先来看公平锁和非公平锁,我们默认使用的锁是非公平锁,只有当我们显示设置为公平锁的情况下,才会使用公平锁,下面我们简单看一下公平锁的源码,如果等待队列中没有节点在等待,则占有锁,如果已经存在等待节点,则返回失败,由后面的程序去将此线程加入等待队列

通过上面的代码,我们可以推断,当使用公平锁的情况下,并且同一个线程的执行时间较长时,线程内部进行了多次的锁的获取和释放,效率非常低下,可以参加Lesson8中的demo:

demo Lesson8LockIntPerform:在使用ReentrantLock加非公平锁的情况下100个线程循环下单数为:857239882

demo Lesson8LockIntPerform:在使用ReentrantLock加非公平锁的情况下100个线程循环下单数为:860364303

demo Lesson8LockFairIntPerform:在使用ReentrantLock加公平锁的情况下100个线程循环下单数为:19153640

demo Lesson8LockFairIntPerform:在使用ReentrantLock加公平锁的情况下100个线程循环下单数为:19076567

上面的demo中,在使用公平锁的情况下性能明显降低,非公平锁的性能是公平锁性能的几十倍以上,这和公平锁每次试图占有锁时,都必须先要进等待队列,按照FIFO的顺序去获取锁,因此在我们的实验情景下,使用公平锁的线程进行了频繁切换,而频繁切换线程,性能必然会下降的厉害,这也告诫了我们在实际的开发过程中,在需要使用公平锁的情景下,务必要考虑线程的切换频率。

接下来我们来看一下读写锁,通过看读写锁的实现源码,我们可以发现,读锁和写锁共用同一个等待队列,那么在采用非公平锁的情况下,如果读锁的线程执行时间比较长,并且读锁的并发比较高,那么写锁的线程便永远都拿不到锁,那么实际的情况会不会是这样呢?

demo Lesson3WriteReadLock:此demo的读线程在不断的占用读锁,按照推论,写锁的线程是没有机会获取到锁的,但是实际情况是写锁的线程可以正常的获取到锁,那么是什么原因使得写锁的线程可以获取到锁的了?通过查看源代码,会发现有这样的一个方法:

上面的方法,实现了一个新的读线程获取锁的中断,它会读取等待队列中下一个等待锁的线程,如果它是获取写锁的线程,那么此方法返回为真,调用它的程序会把这个试图获取读锁的线程加入到等待队列,从而终止了读线程一直都在占有锁的情况。



  • java涓殑闈炲叕骞抽攣涓嶆曟湁鐨绾跨▼涓鐩村緱涓嶅埌鎵ц鍚
    绛旓細棣栧厛鏉ョ湅鍏钩閿佸拰闈炲叕骞抽攣锛屾垜浠粯璁や娇鐢ㄧ殑閿佹槸闈炲叕骞抽攣锛屽彧鏈夊綋鎴戜滑鏄剧ず璁剧疆涓哄叕骞抽攣鐨勬儏鍐典笅锛屾墠浼氫娇鐢ㄥ叕骞抽攣锛屼笅闈㈡垜浠畝鍗曠湅涓涓嬪叕骞抽攣鐨勬簮鐮侊紝濡傛灉绛夊緟闃熷垪涓病鏈夎妭鐐瑰湪绛夊緟锛屽垯鍗犳湁閿侊紝濡傛灉宸茬粡瀛樺湪绛夊緟鑺傜偣锛屽垯杩斿洖澶辫触锛岀敱鍚庨潰鐨勭▼搴忓幓灏嗘绾跨▼鍔犲叆绛夊緟闃熷垪 閫氳繃涓婇潰鐨勪唬鐮侊紝鎴戜滑鍙互鎺ㄦ柇锛屽綋浣跨敤鍏...
  • JAVA閿佹湁鍝簺绉嶇被,浠ュ強鍖哄埆
    绛旓細1. 鍏钩閿佷笌闈炲叕骞抽攣锛氬叕骞抽攣纭繚绾跨▼鎸夌収璇锋眰閿佺殑椤哄簭鑾峰緱閿侊紝鑰岄潪鍏钩閿佸垯涓嶄繚璇佽繖涓鐐癸紝鍙兘瀵艰嚧绾跨▼楗ラタ鎴栦紭鍏堢骇鍙嶈浆銆Java涓殑ReentrantLock鍙互琚瀯閫犱负鍏钩閿佹垨闈炲叕骞抽攣锛岃岄粯璁ゆ儏鍐典笅瀹冩槸闈炲叕骞崇殑銆係ynchronized鍏抽敭瀛楀湪Java涓篃瀹炵幇浜嗛潪鍏钩閿佹満鍒躲2. 鍙噸鍏ラ攣锛氫篃绉颁负閫掑綊閿侊紝鍏佽鍚屼竴绾跨▼澶氭...
  • java 鍝簺閿
    绛旓細1. 鍏钩閿佷笌闈炲叕骞抽攣銆2. 涔愯閿佷笌鎮茶閿併3. 閲嶉噺绾ч攣鍜岃交閲忕骇閿併4. 鍋忓悜閿併傛帴涓嬫潵锛屽姣忕閿佽繘琛岃缁嗙殑瑙i噴锛氬叕骞抽攣涓庨潪鍏钩閿侊細鍏钩閿佸湪璇锋眰閿佺殑杩囩▼涓槸涓ユ牸鎸夌収鏃堕棿椤哄簭杩涜鐨勶紝鍏堟潵鍏堝緱锛屽悗鏉ュ悗寰楋紝涓嶄細鍙楀埌鍏朵粬绾跨▼鐨勫共鎵般傞潪鍏钩閿佸垯涓嶄繚璇佽姹傜殑娆″簭锛屽湪楂樺苟鍙戠幆澧冧笅锛岄潪鍏钩閿佸彲浠...
  • java 閿佹湁鍑犵
    绛旓細瀵逛簬Java ReentrantLock鑰岃█锛岄氳繃鏋勯犲嚱鏁版寚瀹氳閿佹槸鍚︽槸鍏钩閿侊紝榛樿鏄闈炲叕骞抽攣銆傚浜嶴ynchronized鑰岃█锛屼篃鏄竴绉嶉潪鍏钩閿併傜敱浜庡叾骞朵笉鍍廟eentrantLock鏄氳繃AQS鐨勬潵瀹炵幇绾跨▼璋冨害锛屾墍浠ュ苟娌℃湁浠讳綍鍔炴硶浣垮叾鍙樻垚鍏钩閿併傚彲閲嶅叆閿 鍙噸鍏ラ攣鐨勬蹇垫槸鑷繁鍙互鍐嶆鑾峰彇鑷繁鐨勫唴閮ㄩ攣銆備妇涓緥瀛愶紝姣斿涓鏉$嚎绋嬭幏寰椾簡鏌...
  • 浠涔堟槸Java涓殑鍏钩閿
    绛旓細棣栧厛Java涓殑ReentrantLock 榛樿鐨刲ock锛堬級鏂规硶閲囩敤鐨勬槸闈炲叕骞抽攣銆備篃灏辨槸涓嶇敤鑰冭檻鍏朵粬鍦ㄦ帓闃熺殑绾跨▼鐨勬劅鍙楋紝lock()鐨勬椂鍊欑洿鎺ヨ闂槸鍚﹀彲浠ヨ幏鍙栭攣锛岃屼笉鐢ㄥ湪闃熷熬鎺掗槦銆備笅闈㈠垎鏋愪笅鍏钩閿佺殑鍏蜂綋瀹炵幇銆傞噸鐐瑰叧娉╦ava.util.concurrent.locks.AbstractQueuedSynchronizer绫 鍑犱箮鎵鏈塴ocks鍖呬笅鐨勫伐鍏风被閿侀兘鍖呭惈浜嗚绫荤殑...
  • java synchronized 鍏钩閿鍚
    绛旓細鍦Java涓锛宻ynchronized灏辨槸闈炲叕骞抽攣锛屽畠鏃犳硶淇濊瘉绛夊緟鐨勭嚎绋嬭幏鍙栭攣鐨勯『搴忋傚叧浜庨潪鍏钩閿 闈炲叕骞抽攣鍗虫棤娉曚繚璇侀攣鐨勮幏鍙栨槸鎸夌収璇锋眰閿佺殑椤哄簭杩涜鐨勩傝繖鏍峰氨鍙兘瀵艰嚧鏌愪釜鎴栬呬竴浜涚嚎绋嬫案杩滆幏鍙栦笉鍒伴攣銆
  • Java涓湁鍝簺閿,鍖哄埆鏄粈涔
    绛旓細//榛樿鏄笉鍏钩閿侊紝浼犲叆true涓哄叕骞抽攣锛屽惁鍒欎负闈炲叕骞抽攣 ReentrantLock reentrantLock = new ReetrantLock();1 2 銆2銆戝叡浜攣鍜岀嫭浜攣 鐙韩閿侊細涓娆″彧鑳借涓涓嚎绋嬫墍璁块棶 鍏变韩閿侊細绾跨▼鍙互琚涓嚎绋嬫墍鎸佹湁銆俁eadWriteLock 璇婚攣鏄叡浜攣锛屽啓閿佹槸鐙韩閿併傘3銆戜箰瑙傞攣鍜屾偛瑙傞攣銆備箰瑙傞攣锛氬浜庝竴涓暟鎹...
  • 璇磋java閿佹湁鍝簺绉嶇被,浠ュ強鍖哄埆
    绛旓細娉細璇ヤ緥瀛愪负闈炲叕骞抽攣锛岃幏寰楅攣鐨勫厛鍚庨『搴忥紝涓嶄細鎸夌収杩涘叆lock鐨勫厛鍚庨『搴忚繘琛屻Java閿鐨勭绫讳互鍙婅鲸鏋愶紙浜岋級锛氳嚜鏃嬮攣鐨勫叾浠栫绫 閿佷綔涓哄苟鍙戝叡浜暟鎹紝淇濊瘉涓鑷存х殑宸ュ叿锛屽湪JAVA骞冲彴鏈夊绉嶅疄鐜(濡 synchronized 鍜 ReentrantLock绛夌瓑 ) 銆傝繖浜涘凡缁忓啓濂芥彁渚涚殑閿佷负鎴戜滑寮鍙戞彁渚涗簡渚垮埄锛屼絾鏄攣鐨勫叿浣撴ц川浠ュ強绫诲瀷鍗...
  • java绾跨▼閿佹湁鍑犵
    绛旓細1銆佽嚜鏃嬮攣 2銆佽嚜鏃嬮攣鐨勫叾浠栫绫 3銆侀樆濉為攣 4銆佸彲閲嶅叆閿 5銆佽鍐欓攣 6銆佷簰鏂ラ攣 7銆佹偛瑙傞攣 8銆佷箰瑙傞攣 9銆佸叕骞抽攣 10銆闈炲叕骞抽攣 11銆佸亸鍚戦攣 12銆佸璞¢攣 13銆佺嚎绋嬮攣 14銆侀攣绮楀寲 15銆佽交閲忕骇閿 16銆侀攣娑堥櫎 17銆侀攣鑶ㄨ儉 18銆佷俊鍙烽噺
  • 鍏充簬synchronized鍜宭ock鍝簺璇存硶姝g‘
    绛旓細褰撲竴涓嚎绋嬭繘鍏ヨsynchronized淇グ鐨勬柟娉曟垨浠g爜鍧楁椂锛屽畠浼氳幏鍙栬閿侊紝褰撶嚎绋嬬寮璇ユ柟娉曟垨浠g爜鍧楁椂锛屽畠浼氶噴鏀捐閿侊紝浣垮緱鍏朵粬绾跨▼鍙互鑾峰彇璇ラ攣骞惰繘鍏ヨ鏂规硶鎴栦唬鐮佸潡銆2. synchronized涓嶈兘淇濊瘉鍏钩鎬э細杩欐槸姝g‘鐨勩俿ynchronized鎻愪緵鐨勯攣鏄闈炲叕骞抽攣锛屽嵆澶氫釜绾跨▼鍚屾椂鑾峰彇閿佹椂锛岄攣鐨勯噴鏀句笉鏄寜鐓ц幏鍙栭攣鐨勯『搴忚繘琛岀殑...
  • 扩展阅读:java aqs ... java ... 内置锁是非公平锁 ... java锁机制面试题 ... 三个合法的java标识符 ... java中正确的标识符 ... 可重入锁和公平锁 ... java乐观锁和悲观锁 ... 公平锁和非公平锁的区别 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网