zhangd_347
karigan
2015-10-20 14:19
采纳率: 0%
浏览 3.1k

Java静态方法的同步锁

Java静态方法的同步锁必须是字节码class吗?可以是static对象吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2015-10-20 14:54

    如果你是synchronized加在静态方法上,那么锁就是当前类的class对象,但是如果是在静态方法内部的静态语句块,那么锁对象就可以是任意的可引用的对象。
    如果是加在非静态方法上,那么锁对象就是当前this对象。实例代码:

     public class CTest {
        private static String dataStatic = new String("lock1");
        private  String dataNonStatic = new String("lock2");
    
        //静态方法上的同步,那么锁就是默认的当前CTest.class对象
        public static synchronized  void testStatic(){
            //方法内部的代码块的锁可以是任意的
            synchronized (dataStatic) {
                //
            }
    
            synchronized(CTest.class){
    
            }
        }
    
        //非静态方法上同步,锁为this
        public synchronized void testNonStatic(){
            //代码块内部,锁可以是任意的
            synchronized (this) {
    
            }
    
            synchronized (dataNonStatic) {
    
            }
    
            synchronized (CTest.class) {
    
            }
        }
    }
    
    点赞 评论
  • havedream_one
    havedream_one 2015-10-20 23:29

    synchronized用在静态方法就是意味着要锁住Class

    点赞 评论
  • wwwsssaaaddd
    诸相非相 2015-10-21 02:31

    使用synchronized代码块的话同步锁可以是其他static对象,表示把锁加在该static对象上。下面这个是加载o上

     class Test
    {
        public static Object o = new Object();
    
        public static void test(){
            synchronized(o){
                System.out.println("test");
            }
    
        }
    }
    

    但是用synchronized修饰静态方法的话,那么只能是给当前类的class对象加锁。下面这个锁加在Test.class上

     class Test
    {
        public synchronized static void test(){
                System.out.println("test");
        }
    }
    
    点赞 评论

相关推荐