问题:首先是关于 synchronized 关键字,如下面这段代码。
 public void run() {
    while(!canceled) {
      synchronized(this) {
        ++number;
      }
      print(this + " Total: " + count.increment());
      try {
        TimeUnit.MILLISECONDS.sleep(100);
      } catch(InterruptedException e) {
        print("sleep interrupted");
      }
    }
在main()里:同时执行3个线程,但是上面的run()方法已经被锁定,那么其他线程就不能访问了?
for(int i = 0; i < 3; i++)
      exec.execute(new Entrance(i));
    TimeUnit.SECONDS.sleep(1);
    Entrance.cancel();
    exec.shutdown();我一直不搞不明白,既然说 synchronized 能够将方法锁住,防止其他线程进行访问,可是当执行多个线程的时候,同一方法还是被同时访问了,所以对这个概念很模糊,希望大家能帮忙指点下。~~

解决方案 »

  1.   

    synchronized 指的是同步,也就是说
    synchronized(this) {
            ++number;
          }
    里面的操作不能被打断.而且你这里的this是当前对象,如果是3个线程的话是3个不同的对象,不是在一个地方加的锁,相互没什么影响.
      

  2.   

     synchronized 能够将方法锁住,防止其他线程进行访问synchonized的准确意思是说,如果synchronized锁住的是同一个对象的锁,切记是同一个对象的锁,那么该对象的方法将不能被多线程同时进入。
      

  3.   

    关键在于synchronized(锁)
    你使用了this,这种写法最容易导致初学者出错
     
    多个线程使用一个对象 
    ThreadTest t= new ThreadTest();
    new Thread(t).start();
    new Thread(t).start();
    这个时候你锁this是可以的
    多个线程使用不同对象
    new ThreadTest().start();
    new ThreadTest().start();
    new ThreadTest().start();
    这个时候你锁this是没用的结合楼上各位所述,你再理解下