繁体   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