今天看java多线程时,书中说对于在类中给2个以上的静态方法加synchronized时,那么线程不会同时进入这2个静态方法的,这是处于对类中静态变量的保护,但是线程可以执行类中的非静态方法,如果这个时候类中的非静态方法修改了静态变量的值,或者程序中的其他地方直接修改静态变量的值,那么对于静态变量的同步不就失败了吗?困惑中

解决方案 »

  1.   

    静态方法加synchronized相当于锁该类的Class对象,所以每次只有一个线程能访问synchronized静态方法
    [这是处于对类中静态变量的保护]这个应该是针对没有非静态方法的类而言的,如果有非静态方法,正如LZ所理解的一样,因为非静态方法的同步是锁实例对象的,不能达到类的Class对象的同步
      

  2.   

    当静态变量被zychronized的时候其他的线程不管怎么设置,但是只能有一个线程设置,如果第二个线程设置的时候那么就的等待一个线程运行完成以后他才能设置
      

  3.   

    "如果这个时候类中的非静态方法修改了静态变量的值,或者程序中的其他地方直接修改静态变量的值,那么对于静态变量的同步不就失败了吗"
    是这样的,java并没有说同步了就线程安全了,要充分同步才会线程安全,如何充分同步?就是对一个或一些变量的读与写全部同步才能达到!