2,“多线程时,会不会出现一个判断str == null跳出,另一个再判断str == null”
不会
因为对象已经加锁了,只有当一个线程执行完代码块中的所有代码,另外一个线程才可能进入

解决方案 »

  1.   

    加锁?不是这种叫法吧:)
    多线程的到此就要排队执行了,所以不会存在你说的那种问题~
    synchronized(a){
      

  2.   

    如果另一个线程调用不同的方法改变str的值,好像采用同步的方法没有用处?
    例如下面代码:A a = new A();
    第一个线程:
    synchronized(a){
        if (a.str == null) {
           a.str = new String();                                                   
        }else{
           a.str = str+"abc"; 
        }
    }
    第二个线程
    a.str = str+"cde";Class A{
        String str;
    }
      

  3.   

    synchronized(a){}中的语句都是原子性的,
    也就当一个线程执行到synchronized(a){}中时,是不会被
    打断的而去执行另一个线程的。如果你的第二个线程不是使用synchronized(a){}
    来改变a的内容的,那当然就没有同步的意义了。
    或是你在Class A中定义synchronized的方法,外部只能通过这个方法来
    改变a的属性,那么a就是互斥的了。