你在run上面加sychronized 是没有什么意义的1.sychronized 的意思是对同一个对象而言,对于a b来说它们的lock是不一样的,所以其实是可以同时进入run方法2.当然,对CPU而言是只有一个线程在运行同步的最大用处是解决线程访问上的冲突,假如我有一个方法
public class A {
  private int count;
  public void test() { 
    if(count == 10) {
      count = 0;
    }
    count++;
    ...
  }
}
以上是一个例子(当然代码是很笨的一个写法了)
如果A obj = new A();以后,在线程a和线程b中都可以访问到对象obj,都调用了方法test
问题来了:开始线程a先运行,当它判断完count == 10之后,正准备但是还没有执行count = 0时候,线程a的时间片已经到了。切换到线程b运行,它运行完count++之后,b的时间片也完了,又换回线程a,a执行了count = 0;这样你很明显看到方法的本意已经被打破,出现了线程同步问题。但是如果加入了public sychronized void test()之后,线程a进入了方法,当时间片完了以后,线程b也想执行方法test,但是由于sychronized 了且a已经拿到了obj的锁,所以线程b进入等待状态直到线程a退出方法test为止

解决方案 »

  1.   

    使用线程可以分配到多个cup上进行计算。
      

  2.   

    谢谢楼上那位老师的解答!
    可是按照你的解答,
    1,你说线程a 的时间片到了,我想知道时间片是多长呢,有一个明确的数字吗?线程a和线程b的时间片是一样的吗?
    2,你说:"于sychronized 了且a已经拿到了obj的锁,所以线程b进入等待状态直到线程a退出方法test为止",
       也就是synchronized可以延长a的时间片了?对吗?
      

  3.   

    1、时间片是自己设定的
    2、不是说可以延长时间片,是因为函数有了synchronized修饰,即使a的时间片到了,也必须等它执行完才释放锁