3分鐘帶你沉迷於執行緒運動
1、執行緒安全問題出現的原因 -----
多個執行緒訪問統一資源,有可能出現執行緒安全問題
解決方法-> Ⅰ使用synchronized鎖{}Ⅱ使用程式碼塊兒解決執行緒安全問題,不能將統一資源的變數放置外面,任何物件都可以當鎖: 每一個物件身體裡面都有一個開關
2、synchronized那些事
2.1 ynchronized 修飾一個方法,表示該方法是執行緒安全的,即該方法在同一時間點只有一個執行緒在使用,直到該方法執行完畢為止
2.2synchronized 修飾一個非靜態方法: 該鎖指的是這個類的例項化物件 this
2.3synchronized 修飾一個靜態方法: 該鎖指的是這個類的序列化檔案 WindowThread02.class
3 執行緒安全問題: 使用哪個方案比較好? 使用程式碼塊兒
* 1) 使用程式碼塊兒可以指定鎖物件
* 2) 使用程式碼塊兒更靈活 程式碼一旦加了鎖,更安全,但是效率極低,我們可以靈活地將出現執行緒安全問題的程式碼塊兒加鎖
4 1、出現安全問題原因?
* 2、咋解決?
* 3、顆粒度 越小越好 synchronized(""){
*
* }
* 4、靜態方法和非靜態方法,鎖物件分別指的是? 類的位元組碼檔案 非靜態: 當前的this物件
* 5、sleep() 不會釋放鎖資源
5
* 多個執行緒訪問多個公共資源,有可能出現死鎖
* 死鎖現象沒有技術可以解決,只有寫程式碼規避
6 // 執行緒的第二種寫法
/**
*
* 1、實現Runnable 介面,重寫run方法
* 2、例項化實現了Runnable 介面的類,當做引數傳遞給Thread構造方法
* 3、通過thread的例項化物件啟動執行緒
*
*
*
* 兩種方案: 哪種好? 第二種好
* 1、java是單繼承的。 如果你編寫了一個執行緒的子類,就無法繼承其他類
* 2、java講究 什麼人幹什麼事兒 Thread已經是一個成熟的類,它主要幹啟動執行緒、執行緒等多個操作即可,就沒必要幹業務邏輯的事兒(程式碼可以對多個執行緒共享)
* 所以如果要寫邏輯,請交給其他類來做。 狗 貓
7 /**
*
* 如何停止一個執行緒?
* 建議方案: 使用標誌
*
* 1、stop: 暴力執法,直接停止正在執行的執行緒,而不管你的業務邏輯現在幹什麼?
* 2、使用標誌停止執行緒,業務邏輯非常完整,非常符合真實的情景
*/
8
* wait() 等待 notify() 喚醒
* 1、這兩個方法不是Thread裡面獨有的,而是Object類的方法
* 2、wait() 和 notify() 必須在同步程式碼塊兒或者同步方法中才能呼叫
* 3、wait() 將當前執行緒進入等待狀態 notify() 喚醒目前執行緒池中的一個等待的執行緒 notifyAll() 喚醒全部
* 4、wait() 和 notify() 呼叫者是鎖物件
*/