首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  Java

关于 synchronized 的疑问

  •  
  •   mengxh1990 · 244 天前 · 1608 次点击
    这是一个创建于 244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 回复  |  直到 2018-02-14 09:49:27 +08:00
        1
    hand515   244 天前
    你没 join
        2
    sagaxu   244 天前 via Android
    第一个线程执行完,while 已经不成立了
        3
    bxb100   244 天前 via Android
    因为你的 while 循环啊
        4
    hand515   244 天前   ♥ 2
    我上面说错了,你线程 1 已经吧 num 减到 0,线程 2 的 while 进不去
        5
    pwrliang   244 天前   ♥ 2
    首先,synchronized 保护的是共享资源,你只创建了一个 TxtThread 实例这是对的,但这里面所有的成员变量都被这两个线程共享,也包括 num,但是你对 num--,这个操作不是原子操作,会造成 race condition,你应该用 AtomicInteger 之类的库。最后不要用 sleep 来等待线程完成,sleep 是不可靠的不一定保证 1000ms 后线程会被调度。应该用 join
        6
    mengxh1990   243 天前
    @hand515 多谢指教
        7
    mengxh1990   243 天前
    @sagaxu 是的,num 被两个线程共享,第一个线程已经把它改变了,thx~
        8
    mengxh1990   243 天前   ♥ 1
    @pwrliang 感谢指教,这里忽略了 num 是被两个线程共享的,第一个线程已经把 num 减为 0,第二个线程的循环条件就不成立了。另外,你提到的对 num 的操作会造成 race condition,这个竞争应该不会发生吧?因为 synchronized 已经保证了只有一个线程能访问到这块代码,即只有一个线程可以操作到成员变量 num,所以在 synchronized 的保护下,应该不会存在 num 上的竞争吧。不知道理解的对不对,还望指教。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1282 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 17ms · UTC 23:59 · PVG 07:59 · LAX 16:59 · JFK 19:59
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1