mengxh1990
V2EX  ›  Java

关于 synchronized 的疑问

  •  
  •   mengxh1990 · Feb 13, 2018 · 4030 views
    This topic created in 3195 days ago, the information mentioned may be changed or developed.
    public class TextThread {
    public static void main(String[] args) {
    TxtThread tt = new TxtThread();
    new Thread(tt).start();
    new Thread(tt).start();
    try {
    Thread.sleep(1000);
    }catch (Exception e) {
    e.getMessage();
    }
    }
    }

    class TxtThread implements Runnable {
    int num = 10;
    String str = new String();
    public void run() {
    synchronized (str) {
    while (num > 0) {
    try {
    Thread.sleep(1);
    }catch (Exception e) {
    e.getMessage();
    }
    System.out.println(Thread.currentThread().getName() + "this is " + num--);
    }
    }
    }
    }

    synchronized 代码块保证两个线程只有一个能够访问这块代码,其他的线程被阻塞,直到前面的线程执行完毕。但是上面这个例子,始终只有一个线程能执行,一个执行完之后另外的线程却不执行。请问这是怎么回事呢?请大神指点。
    8 replies  •  2018-02-14 09:49:27 +08:00
    Finest
    Finest
    Feb 13, 2018
    1
    你没 join
    sagaxu
    sagaxu
    Feb 13, 2018 via Android
    2
    第一个线程执行完,while 已经不成立了
    bxb100
    bxb100
    Feb 13, 2018 via Android
    3
    因为你的 while 循环啊
    Finest
    Finest
    Feb 13, 2018❤️2
    4
    我上面说错了,你线程 1 已经吧 num 减到 0,线程 2 的 while 进不去
    pwrliang
    pwrliang
    Feb 13, 2018❤️2
    5
    首先,synchronized 保护的是共享资源,你只创建了一个 TxtThread 实例这是对的,但这里面所有的成员变量都被这两个线程共享,也包括 num,但是你对 num--,这个操作不是原子操作,会造成 race condition,你应该用 AtomicInteger 之类的库。最后不要用 sleep 来等待线程完成,sleep 是不可靠的不一定保证 1000ms 后线程会被调度。应该用 join
    mengxh1990
    mengxh1990
    OP
    Feb 14, 2018
    6
    @hand515 多谢指教
    mengxh1990
    mengxh1990
    OP
    Feb 14, 2018
    7
    @sagaxu 是的,num 被两个线程共享,第一个线程已经把它改变了,thx~
    mengxh1990
    mengxh1990
    OP
    Feb 14, 2018❤️1
    8
    @pwrliang 感谢指教,这里忽略了 num 是被两个线程共享的,第一个线程已经把 num 减为 0,第二个线程的循环条件就不成立了。另外,你提到的对 num 的操作会造成 race condition,这个竞争应该不会发生吧?因为 synchronized 已经保证了只有一个线程能访问到这块代码,即只有一个线程可以操作到成员变量 num,所以在 synchronized 的保护下,应该不会存在 num 上的竞争吧。不知道理解的对不对,还望指教。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   971 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 19:37 · PVG 03:37 · LAX 11:37 · JFK 14:37
    ♥ Do have faith in what you're doing.