不是的,程序中用了同步,即使你第一个线程sleep 10毫秒,接下来的线程也要等到第一个线程运行完释放了资源后,才能继续运行

解决方案 »

  1.   

    第一个线程到了Thread.sleep(10);的时候,要等待10ms才继续执行。不是“立刻切换到第二个线程”,因为线程什么时候执行是不可确定了。同步“synchronized(str)”其实是无效的,因为每个线程锁定的对象(str)都不一样。
      

  2.   

    "同步“synchronized(str)”其实是无效的,因为每个线程锁定的对象(str)都不一样", 怎么这样的话还有人支持说正确呢? liweigu(liweigu) , 看来你对线程的概念不了解,线程中,是共享对象资源的,在str上加上锁,目的是在以下的程序段中独享str,当前一线程运行完毕释放了str,才轮到下一线程加锁然后继续运行。试想一下,如果没有对没有这里的同步,会出现什么结果? 那会导致4个线程以基本相同的速度运行此程序段,也就是说tick-- 和 tick>0 这个条件将失效。window中4线程以程序片顺序执行,linux下4线程则呈无序执行
      

  3.   

    你说的是同步的作用,没有错。但是请注意str是内部变量,
    如果它是全局变量,并且被每个线程所共用的话,它的锁定才真正有效。参考:
    Every Java object has an associated lock. Java locks can be held by no more than one thread at a time. When a thread enters a synchronized block of code, the thread blocks and waits until the lock is available, acquires the lock when it becomes available, and then executes the block of code.
      

  4.   

    这里是同步,如果把String str =new String(""); 放在run() 里面就不是同步,这就合楼上说的一样。
      

  5.   

    "同步“synchronized(str)”其实是无效的,因为每个线程锁定的对象(str)都不一样", 怎么这样的话还有人支持说正确呢?晕哦,是你没理解对哦,千万不要误导别人哦
      

  6.   

    liweigu(liweigu) ,请注意,str是实例变量,也叫成员变量,实例变量是该实例所有的线程所共享。不知你说说的内部变量和全局变量是什么意思,是否说局部变量? 局部变量是方法中定义的变量。如果仍然不信的话,请你执行一下程序你就会明白我所说的结果。 majy(不上不下) ,我哪里不对了,请反驳。
      

  7.   

    再说明一下,java中没有内部变量和全局变量的说法
      

  8.   

    to: jacob1(行烈色) 
    :)