Synchronized如何工作?

时间:2011-11-16 09:08:56

标签: java swing

我真的不喜欢一次发布多个问题,对不起,如果这很烦人。

我终于设法解决了我的问题。除非我不确定它是否可靠甚至是明智的。

   public void run() {
            // TODO Auto-generated method stub


            float time = 0.01f;
            try {
                while(time < timer)
                {
                       time+=0.1f;
                                       Thread.sleep(100);
                }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        synchronized (ProgressBar.class) {
            int val =++ProgressBar.threadCount;
            if(val == 10)
            {
                                System.out.println("All threads are finished!") ;
            }
        }

    }
}

我现在已经测试了5分钟,它似乎有效。 但有人可以解释发生了什么吗?线程启动时,它确保同步块未被使用,否则等待它完成。 那是一些排队系统吗? 再次感谢。 编辑:

以前的链接 How does AtomicInteger work?

Thread.join freezes progressbar

1 个答案:

答案 0 :(得分:1)

synchronized块在您的案例ProgressBar.class中使用其引用的对象中的锁。如果没有其他线程拥有该锁,则synchronized块获取它并继续。如果锁已经被另一个线程拥有,则synchronized块进入休眠状态以等待锁的释放,此时它再次尝试。一旦拥有锁的线程以synchronized块结束,它就会释放锁,这会导致至少有一个等待锁的线程尝试获取它。

(这个解释忽略了同一个线程在释放之前可能多次获取锁的可能性。只要线程拥有锁至少一次,所有其他线程就被阻止获取它。)

请参阅the Java Language Specification