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