书上说,下面两段代码是非安全,我能理解:
(1)
public class MutableInteger {
    private int value;    public int get() {
        return value;
    }    public void set(int value) {
        this.value = value;
    }
}
(2)
public class SynchronizedInteger {
     private int value;    public  int get() {
        return value;
    }    public synchronized void set(int value) {
        this.value = value;
    }
}但说下面的代码是线程安全的,我理解不了:
(3)
public class SynchronizedInteger {
   private int value;    public synchronized int get() {
        return value;
    }    public synchronized void set(int value) {
        this.value = value;
    }
}
问题:如果一个线程在set,如果还有另外一个线程在get,那后者的线程会别阻塞吗?synchronized针对函数的作用到底是怎样的?对get和set都synchronized,和直接对value进行synchronized,有什么区别吗?十分感谢,请赐教!

解决方案 »

  1.   

    synchronized的作用可以在属性上,也可以在方法上.lz说的情况正是这两中情况的区别.加在方法上,说明线程进入该方法时候时同步的,也就是说同一时间只能有一个线程进入该方法,所以(3)中的两个方法都是同步方法,自然时线程安全的.另外lz说的"如果一个线程在set,如果还有另外一个线程在get,那后者的线程会别阻塞吗?"这个当然不会,因为同步只是针对两个或多个线程想访问同一个资源的时候才会加上同步锁,而一个线程get,一个线程set访问的不是同一资源,当然不会发生阻塞.
      

  2.   

    非常感谢回复!
    我的意思是:
    "如果一个线程在set,如果还有另外一个线程在get,那后者的线程会别阻塞吗?"如果不能阻塞,那指定是非线程安全的,这就和书上说的不一样了.
    请指教!
      

  3.   

    对于一个类的synchronized的方法
    就意味着,如果调用了其对象的一个synchronized方法,
    那么,这个对象的其他synchronized方法会被阻塞
    得到第一个方法调用完成后,才会做之后的synchronized方法
      

  4.   

    一:
    针对的是同一个对象的话,当然会阻塞。
    二:
    synchronized关键字的作用就是同步,同步谁呢?同步调用该方法的对象。
    三:对value进行synchronized?什么意思