分析以下代码,以下说法正确的是() public class SellTicket implements Runnable { private int tickets = 100; private Object obj = new Object(); @Override public void run() { while (true) { synchronized (obj) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } } } } 代码能够实现同步 代码无法实现同步,需要将同步代码块改为synchronized (MyThread.class) 代码能够实现同步,代码num值是不是静态对程序没有影响 代码无法实现同步,num值是不是静态对程序没有影响,只需要将同步代码块改为synchronized (MyThread.class)
时间: 2024-02-14 07:08:25 浏览: 67
选项一:代码能够实现同步是正确的。
这段代码使用了synchronized关键字来保证线程安全。使用obj作为锁对象,确保在同一时刻只有一个线程可以进入synchronized代码块中执行操作。因此,该代码可以实现同步。
选项二:代码无法实现同步,需要将同步代码块改为synchronized (MyThread.class) 是错误的。
使用synchronized (MyThread.class)可以锁定整个类,但是这并不是必要的。在这种情况下,使用obj作为锁对象已经足够。
选项三:代码能够实现同步,代码num值是不是静态对程序没有影响是错误的。
代码中没有使用num变量,因此,该选项不适用于此代码。
选项四:代码无法实现同步,num值是不是静态对程序没有影响,只需要将同步代码块改为synchronized (MyThread.class) 是错误的。
同样,使用synchronized (MyThread.class)并不是必要的。使用obj作为锁对象已经足够。而且,num值是不是静态对程序没有影响,因为num不在同步代码块中使用。
相关问题
public class SellTicket implements Runnable { private int tickets = 100; Object obj = new Object(); @Override public void run() { synchronized (obj) { while (true) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); } } } } }public class SellTicketDemo { public static void main(String[] args) { SellTicket st = new SellTicket(); Thread t1 = new Thread(st,"窗口1"); Thread t2 = new Thread(st,"窗口2"); Thread t3 = new Thread(st,"窗口3"); t2.setPriority(10); t1.setPriority(1); t1.start(); t2.start(); t3.start(); } }为什么只有一个窗口卖票
这是因为在SellTicket类中,使用了一个Object类型的obj对象来进行同步,而在SellTicketDemo类中创建的三个线程都使用了同一个SellTicket对象st,因此它们也共享了同一个obj对象。因此,当一个线程进入synchronized代码块时,其他线程会被阻塞,直到该线程执行完同步代码块并释放锁,其他线程才能进入同步代码块。由于只有一个obj对象,因此只有一个线程能够获得锁,从而执行卖票操作。
添加注释,并解释 Thread.sleep(300);有什么作用。 public class TicketThread implements Runnable{ private int ticket=100; Object o=new Object(); @Override public void run() { synchronized (this){ while (true){ // 1 if (ticket>0){ try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } String name = Thread.currentThread().getName(); System.out.println(name+"正在卖第"+ticket--+"张票。。。。。。"); } } } } }
注释如下:
```java
public class TicketThread implements Runnable{
private int ticket=100;
Object o=new Object();
@Override
public void run() {
synchronized (this){
while (true){
// 1. 判断是否还有票
if (ticket>0){
// 2. 线程睡眠300毫秒
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 3. 卖票,并打印当前售出的票数
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖第"+ticket--+"张票。。。。。。");
}
}
}
}
}
```
Thread.sleep(300) 的作用是让当前线程睡眠300毫秒,即暂停执行,然后再继续执行。在上述代码中,每售出一张票后,线程会暂停300毫秒,以模拟售票员卖票的过程,同时也可以避免线程执行过快导致数据不一致的问题。
阅读全文