class A{
public static int a = 1;
public sychronzied haha(){
  a = 2
}
如上面这个程序,synchronized能阻止一个线程用该类一个对象的haha()方法改变a的值吗?
如果可以改变a的值的话,有什么方法可以把a 的值锁住,让其他线程无法更改a

解决方案 »

  1.   

    设置一个new Object()就可以了
      

  2.   

    synchronized就保证了,当多个线程同时访问一个方法时,synchronized保证每次只有一个线程访问。
      

  3.   

    声明为private,如果不想改变值干脆final
    private final static int a = 1;
      

  4.   


    public static synchronized haha(){
      a = 2
    }
    用类自己来当锁,如果不能改变方法成静态的可以用一个唯一的对象当锁class A{
    public static int a = 1;
    private static Integer i = 0;
    public haha(){
      synchronized(i){
         a = 2
    }
      }
     楼主synchronized打错了。
      

  5.   

    在方法上的synchronized和synchronized(this)等价
    在static方法上的synchronized和synchronized(本身.class)等价一般比较建议建一个空对象来专门用作锁
    静态对象为锁的话,那此类所有实例都共享这个锁public class MyClass{
     private static final Object locker = new Object(); public void haha() {
      synchronized(locker) {
       // TODO
      }
     }
    }
      

  6.   

    直接锁定类即可  synchronized(A.class) {}
      

  7.   

    回6楼,请问锁住locker对象有什么用处吗
      

  8.   

    习惯上来说,建立一个单独的锁对象,代码阅读也比较清晰
    也不容易和其他对象冲突,也不用担心null之类的错误