比如:
  public synchronized void ff(){
         ..............
             .............
           .............
       ..............
             .............  //这里时间片用完。A线退出
           .............
       ..............
             .............
           .............
       ..............
             .............
           .............
}
B线程无法进入,是吗????
是不是一定要等A返回,继续执行完这段,才可以???

解决方案 »

  1.   

    线程同步,当用关键字修饰synchronized 后,只能等这个线程执行完毕,其它线程才可以执行。
      

  2.   

    书上是这么说的:
     synchronized 关键字的作用是由系统自动给被synchronized修饰的方法或代码块加锁,使被修饰的代码在同一时间只能被一个线程访问。我的疑问:难道同一时间,能被两个线程访问,有鬼了。CPU也只有在同一时间被一个资源访问,当然不是说多核的CPU
      

  3.   


    嗯我又明白你的意思了。。你是说既然访问这一个资源在某一时刻就只有一个线程访问那么有必要加锁吗?是吧。没错在单核系统中确实在某一确定时刻下只能有一个线程访问某一资源。那你可以这样认为synchronized可以保证在某一段时间内只有一个线程访问。比如你前一个贴中,当执行一个语句块时,它并没有执行完就可以导致数据不正确。
      

  4.   

    这个其实是涉及到操作系统内核的调度问题了,假如一个线程执行到这个函数的一半的时候就被操作系统中断了(也就是此线程的时间片已经用完了或者被其它优先级高的进程/线程抢占了),轮到其它线程开始运行了,假如其它线程也要执行到这个函数,这种情况下就是所谓的“两个线程同时执行一段代码或者访问同一资源”,至于“同一时间,能被两个线程访问”的说法其实只是从用户的角度来说而已,在操作系统内核层次的话,在单CPU情况下,严格来说这种说法是不准确的,但是在用户层,为了让用户更好的理解这种同步的机制,一般都是采用这样的说法的了
      

  5.   

    以前看的一篇介绍线程模型的文章,看了之后就明白了~http://blog.csdn.net/doudou_bb_08/archive/2008/05/20/2461426.aspx
      

  6.   

    A线程退出了,B线程也无法进入.必须等A将synchronized块执行完毕,B才能进入.
      

  7.   

    是的,执行到method的时候,线程会在线程池里加上lock信息。方式同样的方法执行。
      

  8.   

    加了synchorinized这个关键字的方法里,即使有 sleep(5000000000000).
    也要等它醒过来。其它线程才能使用这个方法吗?十分奇怪。
      

  9.   

    如果A线程执行到一般让B线程继续执行,等A回来的时候发现自己的半成品给改了怎么办?
      

  10.   

    做事就是要有一个先后次序的,不遵守秩序,想怎么干就怎么干,这任务还怎么完成呀java把synchorinized交给你,那就由你来制定规则啦,不听你的听谁的
      

  11.   

    可以使用 Thread.currentThread().getName() 获得当前线程名称,让各个线程自己打印这样就知道是哪个做的