lambda表達式:
函數式接口
1.在重寫接口中的方法時,使用lambda表達式:拷貝小括号,寫死右箭頭,落地大括号
[email protected]注解 被标記的接口中隻能有一個方法聲明 或者可以有一個方法聲明和多個預設的方法 也可以有多個static方法
3.ArrayList是線程稱不安全的 初始空間為10,每次擴容為上一次的一般,例如第一次擴容為5,擴容後為15,第二次擴容為7,擴容後為22…
ArrayList線程不安全的代碼示例
public class ArrayListThreadNotSafe {
public static void main(String[] args) {
List list=new ArrayList();
for (int i = 0; i < 3; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
解決方法
1.List list=new Vector();
2.List list=Collections.synchronizedList(new ArrayList<>())
3.List list=new CopyOnWriteArrayList();//寫時複制
4.HashMap的初始空間為16,每次擴容為上次空間的2倍,例如第一次擴容後的空間為32,第二次為64…
5.一個對象裡面有多個synchronized方法,某一個時刻内,隻要一個線程去調用其中的一個synchronized方法了,其他的線程都隻能等待,換句話說,某一個時刻内,隻能有唯一一個線程去通路這些synchronized方法,也就是說鎖的是目前對象,被鎖定後,其他的線程都不能進入到目前對象的其他的synchronized方法。
6.所有的非靜态問步方法用的都是同一把鎖 執行個體對象本身,synchronized實作同步的基礎:Java中的每一個對象都可以作為鎖。
具體表現為以下3種版式。
對于普通同步方法,鎖是目前執行個體對象。
對于同步方法塊,鎖是synchonized括号裡的配置對象。
對于靜态同步方法,鎖是目前類的Class對象。
當一個線程試圖通路同步代碼共時,它首先必須得到鎖,退出或抛出異常時必須釋放鎖。
也就是說如果一個執行個體對象的非靜态同步方法擷取鎖後,該執行個體對象的其他非靜态同步方法必須等待擷取鎖的方法釋放鎖後才能擷取鎖,可是别的執行個體對象的非靜态同步方法因為跟該執行個體對象的非靜态同步方法用的是不同的鎖,是以無須等待該執行個體對象已擷取鎖的非靜态同步方法釋放鎖就可以獲我他們自己的鎖。
所有的靜态同步方法用的也是同一把鎖–類對象本身,這兩把鎖是兩個不同的對象,是以靜态同步方法與非靜态同步方法之間是不會有靜态條件的。
但是一旦一個靜态同步方法擷取鎖後,其他的靜态同步方法都必須等待該方法釋放鎖後才能擷取鎖,而不管是同一個執行個體對象的靜态同步方法之間,還是不同的執行個體對象的靜态同步方法之間,隻要是它們同一個類的執行個體對象!