java 停止for_java线程for循环没有循环完成就停止了,这是为什么?
你 根據 多線程 和 鎖 的 執行 過程 分析 代碼。理論要先學好。
1、多線程
各線程自己同時運行(cpu太快,你可以理解為同時),各不相干。但遇到多線程同時修改同一變量,會發生并發問題。為什么,深層是計算機內存原理,JMM原理。為了解決這問題,所以用鎖。
2、鎖
單線程是安全的。代碼加鎖了以后,線程想要執行代碼,就要獲取鎖,代碼執行完,鎖釋放。
鎖分很多種??梢愿鶕猛咎匦苑譃閹讉€類型。
樂觀鎖 和 悲觀鎖。
共享鎖 和 排他鎖。(讀寫鎖:讀鎖,設計為共享鎖,同時讀,效率高,線程不等待。寫鎖,只能一個線程操作,代碼變為單線程順序執行。保證變量安全。所以一般都是排他鎖。)
公平鎖 和 非公平鎖。公平:多個線程之間順序輪流拿鎖,每人排隊拿鎖。每人執行同樣的次數,每個線程都能執行,公平,不公平鎖:每次有鎖釋放時,CPU隨機分配一個線程拿鎖。很簡單,那樣有可能一個線程等半天拿不到鎖情況。這就是跟那個故事一樣的道理,就是一個
猴子坐在電腦前,不停的敲鍵盤,只要時間夠長,他可以敲出一部莎士比亞小說集。
可重入鎖 和 不可重入鎖。大部分都是可重入鎖。
sychronized 是 排他鎖,悲觀鎖,不公平鎖,可重入鎖。
你的2個問題。
1、使用Vector,你2子線程都用list鎖,主線程讀list,就是三個線程都用的list這個對象的對象鎖,就是同一個鎖。
子線程代碼你自己看,循環是在同步鎖里面的,搶到鎖以后,循環時不需要搶鎖,因為是可重入鎖,執行完,線程就結束了,線程結束了,鎖也釋放了,只要搶1次鎖就結束了。
main主線程,每次循環調用size()方法搶鎖,執行完,釋放鎖,然后get(i)又搶鎖,然后又釋放鎖,循環1次搶2次鎖。所以搶N次鎖。
2、為什么2子線程用LOCK鎖了,主線程Vector list也打印不全。這很簡單啊。此時主線程用list鎖,和子線程的大鎖LOCK不是同一個鎖,但是和子線程里的add是同一把鎖,都是對象鎖list。
這樣子,2子線程和main主線程要搶鎖。但是代碼你看。這時候子線程要等1毫秒的。主線程1秒后啟動,此時大概有900個數據進list了。主線程也要開始搶鎖了,但是2個子線程都在睡眠中。(為啥都在睡眠中,請仔細思考這里),
主線程每次循環搶2次鎖,沒人和它搶了,他就把900個數據打印完了,主線程結束了。后面子線程繼續往list中加完數據才結束。(自己思考)。2張圖看你自己的代碼。另外,一口吃不成胖子。搞編程的需要時間,因為大部分人沒有那么高的智商。
總結
以上是生活随笔為你收集整理的java 停止for_java线程for循环没有循环完成就停止了,这是为什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python selenium鼠标点击_
- 下一篇: java 内省 反射_Java的反射和内
