201521145048《Java程序設計》第11周學習總結

1. 本周學習總結

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

1110001-20170506183244601-77444936.png

2. 書面作業

本次PTA作業題集多線程

Q1.互斥訪問與同步訪問

完成題集4-4(互斥訪問)與4-5(同步訪問)
1.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什么辦法實現互斥同步訪問(請出現相關代碼)?
1.2 同步代碼塊與同步方法有何區別?
1.3 實現互斥訪問的原理是什么?請使用對象鎖概念并結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎么變化的?
1.4 Java多線程中使用什么關鍵字實現線程之間的通信,進而實現線程的協同工作?為什么同步訪問一般都要放到synchronized方法或者代碼塊中?

1.1、可以使用Lock對象和Condition對象實現

class Account{private  balance;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public Account(int balance) {super();this.balance = balance;}public int getBalance() {return balance;}public void deposit(int money){try{lock.lock();this.balance=getBalance()+money;condition.signalAll();}finally{lock.unlock();}}public void withdraw(int money){try{lock.lock();while(getBalance()==0){try {condition.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}condition.signalAll();this.balance=getBalance()-money;}finally{lock.unlock();}}
}

1.2、答:同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,很明顯,同步方法鎖的范圍比較大,而同步代碼塊范圍要小點,一般同步的范圍越大,性能就越差,一般需要加鎖進行同步的時候,肯定是范圍越小越好,這樣性能更好。

1.3、答:
原理:當資源被訪問,為其上鎖,阻止其他線程訪問,停止訪問時,解鎖,其他線程可以訪問

public synchronized void deposit(int money){//synchronized修飾this.balance=getBalance()+money;notifyAll();}public synchronized void withdraw(int money){//synchronized修飾while(getBalance()==0){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.balance=getBalance()-money;notifyAll();}

在代碼中若無synchronized修飾,可能有多個線程通過deposit或withdraw方法同時存取Account對象的balance屬性。
使用synchronized修飾后
1.線程A執行deposit,balance上鎖,線程B wait,notifyAll之后,balance解鎖
2.線程B執行withdraw,balance上鎖,線程A無法訪問,notifyAll之后,balance解鎖

1.4、答:用wait()、notify()來實現線程之間的協作,放到synchronized方法或者代碼塊是為了防止多個線程訪問同一資源所引起的沖突。

Q2.交替執行

實驗總結
答:要實現交替訪問,首先要將方法全部都用synchronized來修飾,確保所有變量都持有鎖。其次線程之間的協作可以使用wait()和notify()并配合上boolean變量來完成,要做到交替執行,需要中間橋梁來確認是否執行該任務,這個橋梁就是flag。

Q3.互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其可以同步訪問。(關鍵代碼截圖,需出現學號)
3.2 進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)
參考資料:Java多線程之Executor、ExecutorService、Executors、Callable、Future與FutureTask

3.1

//201521145048
public static synchronized void addId() {id++;
}
public static synchronized void subtractId() {id--;
}

3.2

//201521145048
List<Callable<Object>> task=new ArrayList<>();
ExecutorService exec=Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++) {task.add(Executors.callable(new Adder())); }
for (int i = 0; i < 3; i++) {task.add(Executors.callable(new Subtracter()));}
exec.invokeAll(task); 
System.out.println(Counter.getId());
System.out.println("main end");

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

4.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾次,觀察結果,并回答:結果正常嗎?哪里不正常?為什么?
4.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)
4.3 選做:使用Lock與Condition對象解決該問題。

4.1、答:結果不正常,剩余個數從0到10皆有,因為生產者與消費者的存取速度不一致,所以會導致生產和消費不一致

4.2、答:

//201521145048
public synchronized void add(String t) {while(repo.size() == capacity) {System.out.println("倉庫已滿!無法添加貨物。");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}  repo.add(t);notifyAll();
}
public synchronized void remove() {while (repo.size() == 0) {System.out.println("倉庫無貨!無法從倉庫取貨");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}  repo.remove(0);notifyAll();
}

4.3、答:

//201521123023
private Lock lock=new ReentrantLock();
private Condition condition = lock.newCondition();
public synchronized void add(String t) {try{lock.lock();while(repo.size() == capacity) {System.out.println("倉庫已滿!無法添加貨物。");try {condition.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}repo.add(t);condition.signalAll();  }finally{lock.unlock();}}
public synchronized void remove() {try{lock.lock();while (repo.size() == 0) {System.out.println("倉庫無貨!無法從倉庫取貨");try {condition.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}  repo.remove(0);condition.signalAll();}finally{lock.unlock();}}

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

答:
線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的,也就是線程同步
例如

public synchronized static void addId() {id++;
}public synchronized static void subtractId() {id--;
}

多個線程同時運行以上代碼,synchronized關鍵字使得線程同步,多個線程運行結果和單個線程運行結果一致,都為0,

3. 碼云上代碼提交記錄

題目集:多線程(4-4到4-10)

3.1. 碼云代碼提交記錄

在碼云的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索并截圖
1110001-20170506183005679-1590539472.jpg

3.2 截圖多線程PTA提交列表

1110001-20170506182959273-1572735834.jpg

轉載于:https://www.cnblogs.com/Lin-Big-Handsome/p/6816500.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252720.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改chrome記住密碼后自動填充表單的背景

2019獨角獸企業重金招聘Python工程師標準>>> input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {background-color: rgb(250, 255, 189); /* #FAFFBD; */background-image: none;color: rgb(0, 0, 0); } 轉載于:https://my.oschina.net…

2018年我國視頻監控市場趨勢:智能視頻分析進入規模化

在安防領域中&#xff0c;視頻監控無疑是不可缺少的一環。我國是全球視頻安防行業增速最快的國家之一&#xff0c;近年來我國的視頻監控市場經歷了持續強勁的發展。我國視頻監控市場的高速增長反映了對個人安全及財產保護的擔憂增加。為解決該擔憂&#xff0c;公司及個人機構大…

RUP,XP,敏捷原理

①RUP-- RUP&#xff08;Rational Unified Process&#xff0c;統一軟件開發過程&#xff0c;統一軟件過程)是一個面向對象且基于網絡的程序開發方法論。 根據Rational(Rational Rose和統一建模語言的開發者)的說法&#xff0c;好像一個在線的指導者&#xff0c;它可以為所有方…

1001. A+B Format (20)---------------PAT開始

今天是第一次用Java提交PAT的代碼&#xff1a; 源代碼不能直接提交&#xff0c;需要經過修改&#xff1a; 源代碼&#xff1a; 1 package test;//提交時不能顯示這句2 3 import java.util.Scanner;4 5 public class Test_1001 {//提交時名字要改成Main6 public static void…

第一篇:SpringCloud 構建微服務系統之服務注冊和發現(consul)

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/u010046908/article/details/85260629 今天我們要學習的是consul在soringcloud中的使用。首先學習consul之前&#xff0c;我們應該看看consul的官網&#xff0c;對它有一個初…

2018 年視頻監控企業競爭力分析 海康威視連續七年蟬聯全球第一

視頻監控是安防行業的核心 近年來&#xff0c;隨著我國政府對平安城市、" 雪亮工程 " 以及金融和交通運輸等領域的重視&#xff0c;對于安防產品的需求不斷提升&#xff0c;安防市場規模也在隨之不斷擴大。視頻監控是整個安防系統最重要的物理基礎&#xff0c;視頻監…

java 二維數組

二維數組 多維數組可以簡單地理解為在數組中嵌套數組 二維數組的定義格式 二維數組的定義有很多方式 第一種方式 1 int[][] arr new int[3][4]; 上面的代碼相當于定義了一個3*4的二維數組&#xff0c;即二維數組的長度為3&#xff0c;二維數組中的每個元素又是一個長度為4的數…

Ambient occlusion

https://en.wikipedia.org/wiki/Ambient_occlusion https://gamedev.stackexchange.com/questions/23/what-is-ambient-occlusion http://people.mpi-inf.mpg.de/~ritschel/Papers/SSDO.pdf 注解&#xff1a; 論文&#xff08;http://people.mpi-inf.mpg.de/~ritschel/Papers/S…

利用RTL2832u電視棒芯片追蹤民航飛機軌跡

我國民航飛機通訊的頻率為1090Mhz&#xff0c;而rtl2832u電視棒芯片可以接受的頻率范圍為24 – 1766 MHz&#xff08;通過改制Q通道可以接收0-30Mhz的短波&#xff09;下面開始介紹利用rtl2832u電視棒芯片獲取民航航線 第一步淘寶搜索rtl2832u820T(50塊錢就能買到) <ignore_…

預見2019:《2019年中國視頻監控產業全景圖譜》(附產業布局、政策環境、市場規模、發展趨勢)

2019-2024年中國視頻監控設備行業市場需求預測與投資戰略規劃分析報告2019-2024年中國安防行業市場前瞻與投資戰略規劃分析報告2019-2024年中國智能安防行業市場前瞻與投資戰略規劃分析報告2019-2024年中國智能家居設備行業市場前瞻與投資策略規劃報告2019-2024年中國城市軌道交…

nginx負載均衡 頁面緩存

nginx的upstream目前支持4種方式的分配 1、輪詢&#xff08;默認&#xff09; 每個請求按時間順序逐一分配到不同的后端服務器&#xff0c;如果后端服務器down掉&#xff0c;能自動剔除。 2、weight 指定輪詢幾率&#xff0c;weight和訪問比率成正比&#xff0c;用于后端服務器…

Date擴展 正則匹配

<script>Date.prototype.formatfunction(){var dthis;//嚴格匹配 yyyy-mm-dd hh-mm-ssvar reg1/yyyy-mm-dd hh-m-s/;//匹配 yyyy*mm*dd hh*mm*ss *為任意一個除\r\n之外的字符 中間為任意多個空格var reg2/y{4}.m{2}.dd\shh.mm.ss/;reg1.test(arguments[0]);reg2.test(a…

終于有人把EMC基礎知識總結如此清晰

傳導與輻射 電磁干擾(Electromagnetic Interference)&#xff0c;簡稱EMI&#xff0c;有傳導干擾和輻射干擾兩種。傳導干擾主要是電子設備產生的干擾信號通過導電介質或公共電源線互相產生干擾&#xff1b;輻射干擾是指電子設備產生的干擾信號通過空間耦合把干擾信號傳給另一個…

填坑-十萬個為什么?(13)

簡介:很多概念不清或忘記&#xff0c;重新構建自己的知識體系。每天問自己1~多個問題。我是菜鳥 成為大神之路! 1. 經典面試題 for(var i0;i<3;i){ setTimeout(function() { console.log(i) }, 10);}打印結果&#xff1f;分析&#xff1f; for(var i 0; i < 10; i) {con…

WordPress分類列表函數:wp_list_categories用法及參數詳解舉例

http://www.511yj.com/wordpress-wp-categories.html 注意&#xff1a; 1、 wp_list_categories() 和 list_cats() 以及 wp_list_cats() 的使用類似&#xff0c;但是后面 2 個已經棄用。 2、如果你希望不格式化輸出分類&#xff0c;請使用 get_categories() 3、因為 WordPress …

DVP,LVDS和MIPI

Mipi 接口 和 LVDS 接口區別 主要區別&#xff1a; 1. LVDS接口只用于傳輸視頻數據&#xff0c;MIPI DSI不僅能夠傳輸視頻數據&#xff0c;還能傳輸控制指令&#xff1b; 2. LVDS接口主要是將RGB TTL信號按照SPWG/JEIDA格式轉換成LVDS信號進行傳輸&#xff0c;MIPI DSI接口則…

安裝Cornerstone3.1注意點

mac在升級之后就不能社會做任何來源安裝,需要在終端運行 sudo spctl --master-disable//添加任何來源的,再次安裝就可以的轉載于:https://www.cnblogs.com/chengenyan/p/6835970.html

2019我的目標

1 能考上自己理想的高中 2 至少學會一直種語言&#xff08;英語&#xff09; 3 堅持記錄每一天&#xff0c;每個星期至少寫一遍文章 4 堅持到底 轉載于:https://www.cnblogs.com/ta20/p/10203974.html

nodejs開發——require與exports的使用

nodejs開發——require與exports的使用 另一片文章總結&#xff1a;http://www.cnblogs.com/hfultrastrong/p/8036682.html require require函數用于在當前模塊中加載和使用別的模塊&#xff0c;傳入一個模塊名&#xff0c;返回一個模塊導出對象。模塊名可使用相對路徑&#x…

jvm 內存溢出問題排查方法

如果你做TCP通訊或者map集合操作&#xff0c;并發處理等功能時&#xff0c;很容易出現 Java 內存溢出的問題。本篇文章&#xff0c;帶領大家深入jvm&#xff0c;分析并找出jvm內存溢出的代碼。 jvm中除了程序計數器&#xff0c;其他的區域都有可能會發生內存溢出 內存溢出是什么…