/**
*題目:請舉例說明集合類是不安全的
* 1,故障現象:
* java.util.ConcurrentModificationException
* 2,致使緣由
*
* 3,解決方案
* 3.1 vector
* 3.2 Collection.synchronizedList();
* 3.3 new CopyOnWriteArraylist();
*
* 4,優化建議(一樣的錯誤,不出現第二次)
*/
public class NotSafeDemo {
public static void main(String[] args) {
List<String> list= Collections.synchronizedList(new ArrayList<>()); //new ArrayList<String >();
for(int i=1;i<=30;i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);//一邊寫一邊讀
}, String.valueOf(i)).start();
}
}
//筆記:
/*
* 寫時複製:
* copyOnWrite容器即寫時複製的容器,往一個容器添加元素的時候,不直接往當前容器object[]
* 添加,而是先將當前容器object[]進行copy,
* 複製出一個新的容器object[] newElements,而後新的容器object[] newElements裏面添加元素,添加完元素以後,
* 再將原容器的引用指向新的容器,setArray(newArrays);這樣作的好處是能夠copyonWrite容器進行併發的讀,
* 而不須要加鎖,由於當前容器不會添加任何元素。因此copyOnwrite容器也是一種讀寫分離的思想,讀和寫不一樣的容器
*
* */
}
---------------------------------------------------------------------------------------------------------------------------------
public class Lock8 { public static void main(String[] args) { Phone phone=new Phone(); new Thread(()->{ try { phone.sendEmail(); }catch (Exception e){ } },"A").start(); /* try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }*/ new Thread(()->{ try { phone.sendHello(); }catch (Exception e){ } },"B").start(); }}class Phone{ public synchronized void sendEmail() throws Exception{ try { TimeUnit.SECONDS.sleep(4); } catch (Exception e) { e.printStackTrace(); } System.out.println("-----sendEmail"); } public synchronized void sendSMS() throws Exception{ System.out.println("-----sendSMS"); } public void sendHello()throws Exception{ System.out.println("-----sendHello"); }}/** 題目:多線程8鎖* 1,標準訪問,請問先打印郵件仍是短信?郵件,短信* 2,郵件方法暫停4秒鐘,請問先打印郵件仍是短信?郵件,短信* 解釋:一個對象裏面若是有多個synchronized方法,某一時刻線程去調用其中一個的esynchronized方法了,* 其它的線程都只能等待,換句話說,某一時刻內,只能有惟一一個線程去訪問這些synchronized方法* 鎖的是當前對象this,被鎖定後,其它的線程都不能進入到當前的其它的synchronized方法* 3,新增一個普通方法hello(),請問先打印郵件仍是hello?* 4,兩部手機,請問先打印郵件仍是短信?* 5,兩個靜態同步方法,同一部手機,請問先打印郵件仍是短信?* 6,兩個靜態方法,兩個手機,請問先打印郵件仍是短信?* 7,1個普通同步方法,1個靜態同步方法,1部手機,請問先打印郵件仍是短信?* 8,一個普通同步方法,1個靜態同步方法,2部手機,請問先打印郵件仍是短信?* 加一普通方法後發現和同步鎖無關* 換成兩個對象後,不是同一把鎖了,狀況馬上變化。* 都換成靜態同步方法後,狀況又變化* 全部的非靜態同步方法用的都是同一把鎖即實例對象自己* synchronized實現同步的基礎:Java中的每個對象均可以做爲鎖。* 具體表現爲如下3種形式。* 對於普通同步方法,鎖是當前實例對象。***/