为了账号安全,请及时绑定邮箱和手机立即绑定

java synchronized锁不同class的区别是什么

java synchronized锁不同class的区别是什么

浮云间 2019-03-20 17:19:45
下面两段代码有什么区别,有大神给答案吗,好像锁不同对象没什么区别啊code 1synchronized (A.class) {        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }code 2synchronized (B.class) {        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }
查看完整描述

4 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

好多人说没有区别,这样吧,直接上代码和结果吧

public class Test {


    static Runnable lock = new Runnable() {

        @Override

        public void run() {

            synchronized (A.class) {

                try {

                    Thread.sleep(5000);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        }

    };


    static Runnable syncA = new Runnable() {

        @Override

        public void run() {

            A.syncShowTime();

        }

    };


    static Runnable syncB = new Runnable() {

        @Override

        public void run() {

            B.syncShowTime();

        }

    };


    static Runnable lockA = new Runnable() {

        @Override

        public void run() {

            A.lockShowTime();

        }

    };


    static Runnable lockB = new Runnable() {

        @Override

        public void run() {

            B.lockShowTime();

        }

    };


    static Runnable instA = new Runnable() {

        @Override

        public void run() {

            A a = new A();

            a.instShowTime();

        }

    };


    static Runnable instB = new Runnable() {

        @Override

        public void run() {

            B b = new B();

            b.instShowTime();

        }

    };


    public static void main(String args[]) {

        try {

            new Thread(lock).start();

            Thread.sleep(1000);

            System.out.println("S:" + (int) (System.currentTimeMillis() / 1000L));

            new Thread(syncA).start();

            new Thread(syncB).start();

            new Thread(lockA).start();

            new Thread(lockB).start();

            new Thread(instA).start();

            new Thread(instB).start();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}


class A {

    static synchronized void syncShowTime() {

        System.out.println("A sync:" + (int) (System.currentTimeMillis() / 1000L));

    }


    static void lockShowTime() {

        synchronized (A.class) {

            System.out.println("A lock:" + (int) (System.currentTimeMillis() / 1000L));

        }

    }


    void instShowTime() {

        synchronized (A.class) {

            System.out.println("A inst:" + (int) (System.currentTimeMillis() / 1000L));

        }

    }

}


class B {

    static synchronized void syncShowTime() {

        System.out.println("B sync:" + (int) (System.currentTimeMillis() / 1000L));

    }


    static void lockShowTime() {

        synchronized (B.class) {

            System.out.println("B lock:" + (int) (System.currentTimeMillis() / 1000L));

        }

    }


    void instShowTime() {

        synchronized (B.class) {

            System.out.println("B inst:" + (int) (System.currentTimeMillis() / 1000L));

        }

    }

}

S:1469596337

B sync:1469596337

B lock:1469596337

B inst:1469596337

A inst:1469596341

A lock:1469596341

A sync:1469596341


查看完整回答
反对 回复 2019-04-22
?
千巷猫影

TA贡献1829条经验 获得超7个赞

我想题主的意思是synchronized后面的括号里面放A.class和B.class有什么区别,两段代码并不是共存的,楼上的哥们好像理解错题主意思了。如果楼主是这个问题的话,那基本没啥区别。如果这两段代码分别在同一个类的不同方法中,那两个线程可以同时访问同一个对象的这两个方法,并没有什么影响,因为是不同的锁。so,看题主你的问题是什么了

查看完整回答
反对 回复 2019-04-22
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你这问题就好像声明一个int a和声明一个int b有什么区别一样


int a;

int b;


查看完整回答
反对 回复 2019-04-22
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

没有区别,但是请注意,当使用class做为锁的时候由于jvm中每个具体的类只有一个class对象,所以很可能在别处也用了同样的class做为了锁,此时很有可能不注意会造成死锁,实际开发中为了防止误造成死锁的风险,所以可能都是在本类中直接synchronized或者直接用ReentrantLock或者直接new个object当锁


查看完整回答
反对 回复 2019-04-22
  • 4 回答
  • 0 关注
  • 807 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信