[英]Thread Safety and code synchronization in java
我正在閱讀有關Java中的線程安全和代碼同步的信息。 當輸出中顯示true或false時,我不喜歡它的輸出。
您是否有想法從輸出中刪除是非,以提高我的代碼性能?
我的代碼是否根據線程安全和同步工作?
謝謝
public class B {
public int numberOfTotalTickets=2;
public int numberT;
public String nameP;
public boolean check(int numberOfTickets, String name) {
numberT=numberOfTickets;
nameP=name;
if(numberOfTickets <=numberOfTotalTickets) {
actionOk(nameP);
return true;
} else {
actionNotOk(nameP);
return false;
}
}
public void actionOk(String nameP) {
numberOfTotalTickets=numberOfTotalTickets-numberT;
System.out.println("your booking is complete"+" "+ nameP);
}
public void actionNotOk(String nameP) {
System.out.println("number of tickets available"+" "+ numberOfTotalTickets);
System.out.println("sorry"+" "+ nameP +" " +"your booking is not complete because we have only"+" "+numberOfTotalTickets+" "+"tickets");
}
public static void main(String[] args) {
B b = new B();
System.out.println(b.check(2, "jack"));
System.out.println(b.check(2, "sam"));
}
}
我的代碼的輸出是
your booking is complete jack
true
number of tickets available 0
sorry sam your booking is not complete because we have only 0 tickets
false
此代碼不是線程安全的。
public void actionOk(String nameP) {
numberOfTotalTickets=numberOfTotalTickets-numberT;
System.out.println("your booking is complete"+" "+ nameP);
}
如果兩個線程同時訪問實例變量,則可能返回錯誤數量的票證。
考慮一下
Thread1: read number of tickets as 2
Thread1: interrupted
Thread2: read number of tickets as 2
Thread2: assigns 2 tickets
Thread1: resumes and also assigns 2 tickets.
兩個線程都會看到有2張票。
關於true / false的打印:您正在打印check
函數的輸出,因為它是boolean
類型,並且在System.out.println
內部調用它。 無需System.out.println
即可直接調用它。
關於線程安全性:當不需要其他類的訪問時,請嘗試使用private
訪問修飾符。 如果我正確理解了您希望使用此代碼實現的目標(您只需要從外部調用check
),則可以將除check
方法之外的所有內容都轉換為private
,並通過向此方法添加synchronized
關鍵字來保證安全。
public synchronized boolean check(int numberOfTickets, String name) {
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.