一.多執行緒訪問臨界資源1.多個執行緒訪問乙個資源,乙個執行緒使用後來被搶走,臨界資源問題就產生了。
2.解決方法:使用的時候上把鎖,取錢的時候不能存,存的時候不要取錢即可。
3.鎖 :任意的物件都可以被當做鎖使用。
4.同步**塊 同步synchronized有等待
(1)同步非靜態方法 synchronize boolean 返回值boolean
(2)同步靜態方法:在宣告屬性的時候加上static,變成非靜態,方法返回值加上static。
非同步asynchronized 沒有等待,各執行各的。
5.可重入鎖(reentrantlock)
在類中定義乙個reentrantlock,reentrantlock lock=new reentrantlock(); 上鎖跟解鎖是都必須有的,乙個出現另乙個也出現。用try catch的時候解鎖要放在fianlly中。
二.死鎖每個人都有其他人需要的資源,又要等待對方的資源,在獲得所需要的資源之前又沒有放棄之前擁有的資源。
***死鎖的條件:1.兩個以上的執行緒 2.至少兩個鎖以上 3.同步中巢狀同步。
三.多執行緒在單例中的應用:餓漢式(無線程問題)和懶漢式(有執行緒問題)***單例實現的步驟:1.私有化構造方法2.在類中建立物件 3.通過公開的方法返回這個物件
private singleton(){}
private static singleton instance =new singleton();
public static singleton getinstance()
懶漢式寫法需要解決執行緒問題,1.禁止反射破解2.加volatile3.加鎖解鎖
public class singleton
}} private static volatile singleton instance; //volatile:不穩定的,易揮發的
public static singleton getinstance()
}} return singleton; }
}/**
* 執行緒類
* @author wgy
* */
public class singletonthread extends thread
}package com.qf.day20_6;
public class test
}
靜態內部類寫法
public class singleton2
static class holder
public static singleton2 getinstance()
}
使用列舉
public enum singleton3
}
四.執行緒的通訊:生產者與消費者設計模式描述的是一塊有緩衝區作為倉庫,生產者將產品放到倉庫,消費者從倉庫拿走商品。
wait()等待 緩衝區已經滿了或空的時候,生產者消費者停止自己的執行放棄鎖,讓自己處於等待狀態,讓其他執行緒執行。
notify()喚醒 :生產者或者消費者放入訊號,讓其他等待的執行緒執行,同時放棄鎖,讓自己處於等待狀態。
notifyall()全部喚醒 喚醒所有等待的物件。
使用鎖寫生產和消費麵包
public class breadcon
public void input(bread b) catch (exception e)
}con = b;
system.out.println(thread.currentthread().getname() + "生產了" + b.getid() + "麵包");
flag = true;
concondition.signal();
} finally
}
public void output() catch (exception e)
}bread b = con;
system.out.println(thread.currentthread().getname() + "消費了" + b.getid() + "麵包, 生產者名字:" + b.getproductname());
con = null;
flag = false;
procondition.signal();
} finally }
}
讀寫鎖: 可以實現多個執行緒同時讀取資料,寫執行緒需要互斥執行 讀寫 寫寫互斥 讀讀不需要互斥
執行緒池:維護成乙個佇列,然後讓其他的執行緒處於等待狀態的執行緒,不用每次都建立新的執行緒。
executorservice threadpool = executors.newfixedthreadpool(4);
executorservice threadpool = executors.newfixedthreadpool(4);
scheduledexecutorservice threadpool = executors.newscheduledthreadpool(5);
實現類:
1 threadpoolexecutor:executorservice的實現類,負責執行緒池的建立使用。
2 scheduledthreadpoolexecutor:繼承 threadpoolexecutor,並實現 scheduledexecutorservice介面,既有線程池的功能,又具有執行緒排程功能。
3 executors:執行緒池的工具類,負責執行緒池的建立。
newfixedthreadpool();建立固定大小的執行緒池。
newcachedthreadpool();建立快取執行緒池,執行緒池大小沒有限制。根據需求自動調整執行緒數量。
newsinglethreadexecutor();建立單個執行緒的執行緒池,只有乙個執行緒。
newscheduledthreadpool();建立固定大小的執行緒池,可以延遲或定時執行任務。
多執行緒基礎
對於多執行緒程式設計,很多人概念不清,寫 的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。所以學習多執行緒程式設計最重要的不是學習 api,而是理解什麼才是多執行緒安全的 從例子說起 include include long global1 0 volatile ...
多執行緒基礎
什麼是併發 同時執行多個程式,或者乙個程式的多段 在巨集觀上,存在併發的,但是在微觀上,其實不存在併發 時間片 在計算機中,使用時間片來實現併發的運算 在計算甲中,在最小的單位時間上 只能執行乙個運算 用來控制多個程式之間的輪轉,使得程式交替的執行 達到併發的目的 多個cpu 多個核心 才能實現真正...
多執行緒基礎
多執行緒的最底層依賴於unsafe的compareandswap cas 和locksupport的park和unpark操作。cas需要傳遞兩個引數 expect和update。先跟第乙個引數expect進行比較,如果等於第乙個引數,那麼就將該值設定為第二個引數,這是由硬體提供的原子操作,所以不會...