今天學習了的主要內容:
1.多執行緒訪問同一個共享的資料情況決議
2.java記憶體模型JMM
3.創建多執行緒呼叫一個變數的情況
多執行緒訪問同一個共享的資料情況決議:
靜態域、陣列還有實體都在堆中被創建,都能夠被任何執行緒訪問,
可能會被多個執行緒并發訪問然后被修改,這種情況沒有任何警告,
java記憶體模型JMM:
它主要描述了程式中的變數在啥時候以啥方式和順序以及怎么存盤
到主記憶體中,以及以什么樣的方式從主記憶體中讀取出來,
java程式當中執行緒總共有兩種記憶體使用型別:
作業記憶體(working memory)和主記憶體(main memory),
主記憶體就是所有執行緒共享的記憶體區域,可以用于執行緒之間互相通信,
每個執行緒都有屬于自己的用于存盤使用的區域變數的堆疊,都有自己的作業記憶體,
原子性(atomicity):除了long和double外,物件屬性的讀寫是原子的,
可見性(visibility):一個執行緒怎樣讀取另一個執行緒作業空間修改過的值
當某個執行緒首次讀取主空間變數的值時,它有可能是初始值也可能是其他執行緒寫入后 的值,
volatile(不穩定的)變數總是寫入主記憶體中,也總是從主記憶體中讀取變數的值,
當執行緒終止時該執行緒從主空間得到的在作業空間操作的值將被寫入主記憶體,
執行緒進入同步塊時作業空間中的值將被讀取,
有序性(ordering):執行緒中執行的操作都是有序的,
創建多執行緒呼叫一個變數的情況
代碼:
Bank類(模擬銀行的賬戶提供提款功能):
package LessonForThread05;
public class Bank
{
protected int money = 1000;
public int getMoney()
{
return money;
}
public void setMoney(int money)
{
this.money = money;
}
public void drawMoney(int sum)
{
if (sum <= 0)
{
System.out.println("您輸入的數值不正確!");
return;
}else if (sum > this.getMoney())
{
System.out.println("您輸入的金額超出自身賬戶余額了!");
return;
}else
{
try
{
Thread.sleep(2000);//在執行取款前,先讓他休息一秒,使執行緒交叉取款
} catch (InterruptedException e)
{
e.printStackTrace();
}
this.setMoney((this.getMoney() - sum));
System.out.println("本次取款:"+sum+"元,賬戶余額為:"+this.getMoney());
}
}
}
Person類(個人提款動作執行緒實作體):
package LessonForThread05;
public class Person implements Runnable
{
protected Bank account;
public Person(Bank account)
{
this.account = account;
}
@Override
public void run()
{
this.account.drawMoney(300);
}
}
Test類(實作多執行緒呼叫同一個屬性):
package LessonForThread05;
public class Test
{
public static void main(String[] args)
{
Bank b1 = new Bank();
for (int i=0; i<10; i++)//反復創建十個不同的執行緒來呼叫取錢方法,
{
Thread t = new Thread(new Person(b1));
t.start();
}
try //主執行緒讓出時間來給子執行緒取錢
{
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("完畢!目前余額:"+b1.getMoney());
}
}
本篇部分文字來源于:
咕嘟咖啡楊海濱老師 — 《java編程語言高級特性》
在這里十分感謝老師能夠給我帶來學習的激情,
2020.10.23
可以轉載我的學習日記但請注明出處,謝謝,
本文章是本人學習筆記,不進行任何商用!也請別拿去商用!只為記錄本人學習歷程,
畢
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190945.html
標籤:java
上一篇:單例模式的六種實作方式
