被synchronized同步锁锁住的资源,在同一时刻只能有一个线程来访问,如果此时其他线程要访问该资源,那么就必须等待,直到前一个线程执行完被锁住的资源释放锁其他的线程才可以访问

解决方案 »

  1.   

    正如lip009(深蓝忧郁) 所言
    看加锁保护的对象是什么
    第三个不太肯定 
    第四个 保护了ARRAYLIST第三个我不清楚 当THIS作为同步对象时
    是不是所有属于它的资源都被保护
    包括PROPERTY和METHOD
    但是ARRAYLIST是方法内的局部对象
    我觉得这个地方很可能是 不是 上面写错了 
      

  2.   

    to treeroot(旗鲁特):
    第二个应该是的
    因为它对整个方法进行锁定
    每次只能有一个线程访问此方法
    这个线程运行结束了 下一个才能进来
    而此方法中定义的ARRAYLIST 当然也是同步对象了
      

  3.   

    synchronized 锁定的是对象资源 支持treeroot(旗鲁特)
      

  4.   

    楼上的搞笑
    锁定的是对象资源?
    首先要搞清楚为什么要进行锁定
    那是因为要对对象进行某种临界操作
    进行这种操作之前 对设置锁
    以便每次只有一个线程执行对象的方法来操作对象
    所以 锁的最终目的 是锁方法
    不是锁对象
    而且 在对象中 非SYNCHRONIZED的方法 其他的线程也可以同时访问
    如果照楼上的说法 这样怎么能行呢?
      

  5.   

    晕死,第一次听说锁方法的说法!静态方法同步就是对 Class的一个锁
    实例方法同步就是对 该实例的一个锁不同的对象之间毫不相干。假设卫生间是一种同步资源,只有公用一个卫生间的人上卫生间才需要同步。
    难道别人家的卫生间有没有人用会影响我吗?
      

  6.   

    题目有问题: A  A_1=new A();
             A  A_2=new A();
    是在一个线程里执行还是在两个线程里执行没有说清楚,如果一个线程根本没有同步问题.如果是两个的话,你实例化了两个A,也就是说有两个独立的资源,各自执行各自的任务根本就没有关系嘛.如果只实例化了一个A,并且那个同步方法被两个线程同时运行那才会需要同步
    private byte[0]lock=new byte[0];语法错误
    你干吗不自己运行一下就知道结果了呀.
      

  7.   

    锁的是对象 不是方法..
    A  A_1=new A();
    A  A_2=new A();
    A_1 和 A_2 是不同的对象..各跑各的..互不干扰.
      

  8.   

    synchronized 以及 {} 标注了一个监视区,
    锁的是 监视区 ,监视区 是互斥执行的,本质上来说,被锁的是一个代码块,不是某个对象,锁的是对某个对象进行访问的代码块。而锁在哪里?在某个对象上。
    synchronized(lock_Object){...}
    这个 lock_Object 可以是 Object lock = new Object(); 也可以是某个Class,比如 A.class。只有使用了同一个锁的两个同步块才会互斥。楼主的几个例子,表面上是用了synchronized,但是都不是用同一个锁的。所以都不会互斥。“一”中,如果 private byte[0]lock=new byte[0]; 改成 static private byte[0]lock=new byte[0];
    那么,就会互斥了。如果 二 的方法是静态的,那么也会互斥。三 很没意义,居然企图保护一个方法内的局部对象……!四 的语法错了,java 是不允许这样用的,只有在方法的前面才可以不指定锁,因为锁被隐含了,而且那个同步操作由jvm直接提供支持,是效率最高的。
      

  9.   

    同意niko7,list是个局部List,就像treeroot说的,“难道别人家的卫生间有没有人用会影响我吗”。