Java 为什么这段代码在运行一段时间后总是不打印任何内容?
我运行main方法一段时间后,它将始终不打印任何内容 但如果我取消注释“System.out.println(111);”和“System.out.println(222);”,我想它会正常运行 我获取“soldWorker”线程和“ReturnWorker”线程的转储,它们在Java 为什么这段代码在运行一段时间后总是不打印任何内容?,java,multithreading,Java,Multithreading,我运行main方法一段时间后,它将始终不打印任何内容 但如果我取消注释“System.out.println(111);”和“System.out.println(222);”,我想它会正常运行 我获取“soldWorker”线程和“ReturnWorker”线程的转储,它们在if判断处停止 public class ProducerAndConsumer2 { public static void main(String[] args) { SyncTikcet2 s
if
判断处停止
public class ProducerAndConsumer2 {
public static void main(String[] args) {
SyncTikcet2 syncTikcet = new SyncTikcet2(1);
Runnable syncSoldTicket = () -> syncTikcet.soldTicket();
Runnable syncRefundTicket = () -> syncTikcet.refund();
new Thread(syncSoldTicket, "soldWorker").start();
new Thread(syncRefundTicket, "refundWorker").start();
}
}
class SyncTikcet2 {
private Integer ticketNum;
public SyncTikcet2(Integer ticketNum) {
this.ticketNum = ticketNum;
}
public void soldTicket() {
while (true) {
if (ticketNum > 0) {
ticketNum = ticketNum - 1;
System.out.println("sold ticket,the num is" + ticketNum);
} else {
// System.out.println(111);
}
}
}
public void refund() {
while (true) {
if (ticketNum == 0) {
ticketNum = ticketNum + 1;
System.out.println("refund ticket,the num is" + ticketNum);
} else {
// System.out.println(222);
}
}
}
public Integer getTicketNum() {
return ticketNum;
}
public void setTicketNum(Integer ticketNum) {
this.ticketNum = ticketNum;
}
}
如果您没有使字段不稳定,线程就没有理由重新读取它没有更改的值 尝试使用
private volatile int ticketNum
我建议使用原语,例如
int
,除非必须使用对象引用。它不仅速度更快,而且还清楚地表明您不希望值为null
非常感谢,您太棒了,您的答案引导我找到另一个问题。这个问题和我的一样,答案更详细。再次非常感谢。@wr1ttenyuzhao note System.out.println有一个同步的内存障碍,但是如果没有调用它,您可能看不到更新。是的,这就是为什么当我取消注释“System.out.println(111);”和“System.out.println(222);”时它会正常运行的原因,谢谢您的回答,您是个好人,谢谢