簡體   English   中英

我可以通過不可變對象使此類線程安全嗎?

[英]can i make this class thread safe via immutable object?

我有一堂課,我有2個人檢查余額並從一個普通帳戶中提取資金。.我已通過synchronized關鍵字使交易線程變得安全,但是它有很多開銷,我了解了不可變對象和線程安全性他們提供 。 但是我無法通過不可變對象使此類線程安全

代碼:

final class bank implements Runnable
{
private final int balance,min_balance;

bank(int bal,int mbal)
{
  this.balance=bal;
  this.min_balance=mbal;
}
@Override
public void run()
{
   transaction();

}
public void transaction()
{
   if(checkBalance()> min_balance)
    {
     System.out.println("checkin is done by : "+Thread.currentThread().getName()
             +" and Balance left in the account is : "+checkBalance()); 
     System.out.println(Thread.currentThread().getName()+" is going to sleep ...");
    try{

       Thread.currentThread().sleep(2000); }
       catch(Exception e){
       }
    System.out.println(Thread.currentThread().getName()+" Woke up ..");
    withdraw();  
    System.out.println(Thread.currentThread().getName()+" has made the withdrawl ..");
   }
   else{
      lowBalance();   
   }
}

int checkBalance()
{
   return balance;
 }
 void lowBalance()
 {
     System.out.println("balance is not adequate");
 }

void withdraw()
{
   balance=balance-20;  //this wont work as balance is private
}

}

public class ryanmonica {

  public static void main(String args[])
  {
   bank obj=new bank(100,20);
   Thread t1=new Thread(obj);
   Thread t2=new Thread(obj);
   t1.setName("Ryan");
   t2.setName("Monica");
   t1.start();
   t2.start(); 

 }
}

不可變對象的狀態永遠不會改變。 由於您需要在實例中更改狀態( balanceminBalance正在更改),因此需要使用同步機制。

不可變對象是線程安全的,因為它們不允許在實例中更改狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM