宁程大大 发表于 2019-10-16 17:45

同步锁

本帖最后由 宁程大大 于 2019-10-16 18:38 编辑


public class WindowTest {
    public static void main(String[] args) {
      Window w = new Window();
      Thread t1 = new Thread(w, "窗口一");
      Thread t2 = new Thread(w, "窗口二");
      Thread t3 = new Thread(w, "窗口三");
      t1.start();
      t2.start();
      t3.start();
    }

}

class Window implements Runnable {
    private int ticket = 100;
    Object obj = new Object();

    @Override
    public void run() {


      while (true) {
            synchronized (obj) {
                if (ticket > 0) {
                  try {
                        Thread.sleep(50);
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }

                  System.out.println(Thread.currentThread().getName() + ":" + ticket);

                  ticket--;
                }else{
                  break;
                }
            }
      }
    }
}

Ca1m_01 发表于 2019-10-16 17:54

加了锁,不就是想 一个线程执行,不想让其他线程执行嘛。你的问题应该是 ticket 把 值消耗完了,而已 后面 窗口2 和 窗口3 没有执行。。。建议 学会 debug 再提问。

yaoshihao 发表于 2019-10-16 18:00

你这只创建了一个Window ,那就是已有一个object,只有一个线程能拿到锁

宁程大大 发表于 2019-10-16 18:01

Ca1m_01 发表于 2019-10-16 17:54
加了锁,不就是想 一个线程执行,不想让其他线程执行嘛。你的问题应该是 ticket 把 值消耗完了,而已 后面...

怎么让它们同时执行呢

yaoshihao 发表于 2019-10-16 18:03

宁程大大 发表于 2019-10-16 18:01
怎么让它们同时执行呢

最简单的,你创建3个window对象,就同时执行了

Ca1m_01 发表于 2019-10-16 18:04

不要加锁啊啊啊啊啊 a

宁程大大 发表于 2019-10-16 18:05

yaoshihao 发表于 2019-10-16 18:03
最简单的,你创建3个window对象,就同时执行了

那就变成300张票了

Ca1m_01 发表于 2019-10-16 18:05

你跟哪里学的 代码,去看例子

宁程大大 发表于 2019-10-16 18:15

Ca1m_01 发表于 2019-10-16 18:05
你跟哪里学的 代码,去看例子

这就是源码,他那里可以跑出三个窗口

Ca1m_01 发表于 2019-10-16 18:20

不打辩论。一共就没多少代码,别人可以,你不可以。那就找自己的问题。
页: [1] 2
查看完整版本: 同步锁