java编程思想中关于线程同步的一段裁剪的代码,
对线程同步有点疑问:
class TwoCounter2 extends Thread {
public void run() {
    while (true) {
      synchronized(this) {
        t1.setText(Integer.toString(count1++));
        t2.setText(Integer.toString(count2++));
      }
      try {
        sleep(500); //问题
      } catch (InterruptedException e){}
    }
}
}
问题:
1、当线程执行sleep(500)时,其他线程是否可以访问TwoCounter2对象的同步方法。
2、如果其它线程能访问TwoCounter2对象的同步方法,TwoCounter2它是以什么方式通知
等待线程的。(notify吗?)小弟在线,先谢了

解决方案 »

  1.   

    只要不是 TwoCounter2 的同一个实例 就可以访问 
    据说最好用notifyAll
      

  2.   

    sleep(500)的时候已过同步区域, 其他正在执行的现成当然能调用这段方法,  现成调度是虚拟机进行的,不用你管. 还有, sleep(500)表示当前线程无条件搁置500毫秒, 500毫秒后被虚拟机调度继续运行, 但是如果一旦有线程已经在同步区域,那么它又会进入等待队列, 具体被调度的时候有虚拟机的调度算法算出.
      

  3.   

    个人认为TwoCounter2持有对象级别锁,其他线程应该不可以访问该同步块
      

  4.   

    看错了,原来你的sleep在同步块外面,
      

  5.   

    还有你应该用wait方法替代sleep,这样执行wait的线程会释放对象锁进入休眠状态,等待notifyAll
      

  6.   

    线程sleep(500)时;是否释放它占有的资源
      

  7.   

    wait时,是否释放它占有的资源
      

  8.   

    一个线程调用WAIT方法,使该线程释放加在该对象上的锁并暂时停止执行