国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java開發(fā)中多線程同步技巧

2019-11-18 15:37:25
字體:
供稿:網(wǎng)友

  在編寫一個類時,假如該類中的代碼可能運行于多線程環(huán)境下,那么就要考慮同步的問題。在java中內(nèi)置了語言級的同步原語--synchronized,這也大大簡化了Java中多線程同步的使用。 我們首先編寫一個非常簡單的多線程的程序,是模擬銀行中的多個線程同時對同一個儲蓄賬戶進(jìn)行存款、取款操作的。

  在程序中我們使用了一個簡化版本的Account類,代表了一個銀行賬戶的信息。在主程序中我們首先生成了1000個線程,然后啟動它們,每一個線程都對John的賬戶進(jìn)行存100元,然后馬上又取出100元。這樣,對于John的賬戶來說,最終賬戶的余額應(yīng)該是還是1000元才對。然而運行的結(jié)果卻超出我們的想像,首先來看看我們的演示代碼:

class Account
{
 String name; float amount;
 public Account(String name, float amount)
 {
  this.name = name;
  this.amount = amount;
 }
 
 public void deposit(float amt)
 {
  float tmp = amount;
  tmp += amt;
  try
  {
   Thread.sleep(100);
   //模擬其它處理所需要的時間,比如刷新數(shù)據(jù)庫
  }
  catch (InterruptedException e)
  {
   // ignore
  }
  amount = tmp;
 }

 public void withdraw(float amt)
 {
  float tmp = amount;
  tmp -= amt;
  try
  {
   Thread.sleep(100);
   //模擬其它處理所需要的時間,比如刷新數(shù)據(jù)庫等
  }
  catch (InterruptedException e)
  {
   // ignore
  }
  amount = tmp;
 }

 public float getBalance()
 {
  return amount;
  }
}

public class AccountTest
{
 PRivate static int NUM_OF_THREAD = 1000;
 static Thread[] threads = new Thread[NUM_OF_THREAD];
 public static void main(String[] args)
 {
  final Account acc = new Account("John", 1000.0f);
  for (int i = 0; i< NUM_OF_THREAD; i++)
  {
   threads[i] = new Thread(new Runnable()
   {
    public void run()
    {
     acc.deposit(100.0f);
     acc.withdraw(100.0f);
    }
   }
   );
  threads[i].start();
 }
 for (int i=0; i<NUM_OF_THREAD; i++)
 {
  try { threads[i].join();
  //等待所有線程運行結(jié)束
 }
 catch (InterruptedException e)
 {
  // ignore
 }
}
System.out.println("Finally, John's balance is:" + acc.getBalance()); }}

  注重,上面在Account的deposit和withdraw方法中之所以要把對amount的運算使用一個臨時變量首先存儲,sleep一段時間,然后,再賦值給amount,是為了模擬真實運行時的情況。

因為在真實系統(tǒng)中,賬戶信息肯定是存儲在持久媒介中,比如RDBMS中,此處的睡眠的時間相當(dāng)于比較耗時的數(shù)據(jù)庫操作,最后把臨時變量tmp的值賦值給amount相當(dāng)于把amount的改動寫入數(shù)據(jù)庫中。運行AccountTest,結(jié)果如下(每一次結(jié)果都會不同):

E:/java/exer/bin>java AccountTest
Finally, John's balance is:3900.0

E:/java/exer/bin>java AccountTest
Finally, John's balance is:4900.0



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 交口县| 吴川市| 宁德市| 英德市| 隆化县| 唐海县| 广平县| 石城县| 康乐县| 榆树市| 太白县| 普洱| 清水县| 西昌市| 永春县| 顺平县| 龙海市| 巫山县| 鸡西市| 隆回县| 宾川县| 灵石县| 昆山市| 修水县| 十堰市| 高陵县| 曲周县| 禄丰县| 蓬溪县| 沾益县| 峨边| 青川县| 清徐县| 武功县| 射阳县| 东方市| 高雄市| 西藏| 扶风县| 民权县| 焦作市|