簡體   English   中英

Java中的線程安全和代碼同步

[英]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.

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