class A extends Thread{
private String s ;public void run(){
  String s1 = null;
synchronized(this){
 s1 = s ;
}
System.out.println(s1);
}public synchronized void setS(String s){ this.s = s;}
}如上这段代码,每一个线程都有一个这个锁,那么synchronized(this)加锁的意义何在?
锁住了哪些操作?

解决方案 »

  1.   


    我不同意这个看法。
    this是一把很好的锁额
      

  2.   


    synchronized(this){ 
    s1 = s ; 
    }  锁住的就是{}中的部分synchronized 放在方法前修饰就是锁住了整个方法的所有语句
      

  3.   

    这里的锁定,应该是锁定已经进入同步块的线程对象,其他线程启动后都会进入run方法内,但是必须在同步块外等待。
      

  4.   

    你先弄清楚 当前语句块中的this是什么 不就知道同步的是什么了么
      

  5.   

    这个类的对象啊。
    或者你也可以这样用synchronized(A.class)
      

  6.   

    每次创建线程不是都会创建一个对象吗?那么每个线程都是在自己的run中运行,那么同步this会对其他线程造成影响吗?我就是这一块不懂,还望指教。另外,这个例子源于tomcat线程池的controlrannable,因此他有意义。
      

  7.   

    我的理解是“synchronized”就像是一把锁,当你加上了他!就只有拥有这把钥匙的人才可以进去!
      

  8.   

    一、两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,
    一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,
    另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时
    ,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
    四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,
    它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
      

  9.   

    刚才想了一下,在这里加入同步块的意义可能在于同一时间只有一个线程执行了这一部分的操作,就是把他当做原子操作来执行,那么把主内存中的数据读入到run方法就是一个原子操作。就不会造成run方法中的变量改变了一半而主内存的变量此时进行了修改的可能。不知道理解的正确不正确。