日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

201521123014 《Java程序设计》第11周学习总结

發布時間:2023/12/10 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 201521123014 《Java程序设计》第11周学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
201521123014 《Java程序設計》第11周學習總結

1. 本周學習總結

1.1 以你喜歡的方式(思維導圖或其他)歸納總結多線程相關內容。


2. 書面作業

Q1 互斥訪問與同步訪問

完成題集4-4(互斥訪問)與4-5(同步訪問)

1.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什么辦法實現互斥同步訪問(請出現相關代碼)?

答: 可以使用Lock對象和Condition對象實現互斥同步訪問,或者還可以使用synchronized代碼塊。synchronized (this) ; 代碼:public void deposit(int money) {lock.lock();try {this.balance = this.getBalance() + money;} finally {lock.unlock();}}public void withdraw(int money) {lock.lock();try {try {while (this.getBalance() <= 0 || this.balance < money)condition.await();condition.signal();} catch (Exception e) {System.out.println(e);}this.balance = this.getBalance() - money;} finally {lock.unlock();// 保證不會發生異常}}

1.2 同步代碼塊與同步方法有何區別?

同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,很明顯,同步方法鎖的范圍比較大,而同步代碼塊范圍要小點,一般同步的范圍越大,性能就越差,一般需要加鎖進行同步的時候,肯定是范圍越小越好,這樣性能更好,因為多個線程只訪問這個對象內部中的某些方法。

1.3 實現互斥訪問的原理是什么?請使用對象鎖概念并結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎么變化的?

每個對象都有一把鎖,只有當線程獲得對象鎖后才能進行訪問,如果未獲得對象鎖,線程無法執行,必須等待。從而通過對象鎖實現了互斥訪問。 多個線程競爭對象鎖,如果線程沒有取得對象鎖,那么就會進入Lock Pool,在取得對象鎖后,會先回到Runnable,然后等待線程調度器將其排入Running。

1.4 Java多線程中使用什么關鍵字實現線程之間的通信,進而實現線程的協同工作?為什么同步訪問一般都要放到synchronized方法或者代碼塊中?

wait()和notify()/nofityAll();存在多個線程同時運行時,沒有互斥,將會使線程運行混亂,例如三個人同時存錢到同一個賬戶時,余額可能出現異常。

2. 交替執行

實驗總結(不管有沒有做出來)

相關代碼:

運行結果:

實驗總結:建立Repo類,用ArrayList字符串數組存儲字符串items;;Worker1和Worker2類繼承Runnable接口,兩個線程交替運行,需要使用wait()和notify()函數,循環條件是o.getsize()!=0,輸出字符串數組,并remove,達到將任務刪除,通過boolean變量來完成任務的交替。任務1執行完后,改變布爾值,并喚醒另一個任務,然后開始執行任務2,任務2執行完后,改變boolean變量,喚醒任務1,這樣交替執行下去直至兩個任務都不能執行為止(這邊就是等到字符串全部輸出為止)。

Q3 互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其可以同步訪問。(關鍵代碼截圖,需出現學號)

3.2 進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)

  • 上網搜索invokeAll方法,在代碼中,兩次for循環的次數要相等,若是不等,則會導致最后結果是相差次數的輸出次數.

Q4 線程間的合作:生產者消費者問題

4.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,并回答:結果正常嗎?哪里不正常?為什么?

結果不正常,在public synchronized void add(String t)和public synchronized void remove()的方法體中應該有wait()和notify()函數來實現線程之間的合作,否則多個線程只是不互斥,卻沒有合作,導致結果出錯

4.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)

Q5 查詢資料回答:什么是線程安全?(用自己的話與代碼總結,寫自己看的懂的作業)

如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。 例如:public synchronized void withdraw(int money){try{while(this.getBalance()<=0||this.getBalance()-money<0){wait();}}catch(Exception e){System.out.println(e);}setBalance(this.balance-money);notify();} 這個是簡單的取錢程序,判斷卡中的金額是否大于取錢的金額,如果大于就取錢。 在多線程的程序里,就存在線程安全的問題。 比如卡中100元,兩個線程都去取 60元,由于線程是并發的,很有可能第一個線程執行的同時,第二個線程進來,判斷卡中還有100元,然后也能運行,這樣就會取出120元錢。

3. 碼云上代碼提交記錄

3.1 碼云代碼提交記錄

3.2 截圖多線程PTA提交列表

posted on 2017-05-06 18:10?Paparazzi 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/huangsh/p/6817418.html

總結

以上是生活随笔為你收集整理的201521123014 《Java程序设计》第11周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。