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

下面两段代码有什么区别,有大神给答案吗,好像锁不同对象没什么区别啊


code 1


synchronized (A.class) {

        try {

            Thread.sleep(5000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

code 2


synchronized (B.class) {

        try {

            Thread.sleep(5000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }


浮云间
浏览 808回答 4
4回答

慕桂英3389331

好多人说没有区别,这样吧,直接上代码和结果吧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:1469596337B sync:1469596337B lock:1469596337B inst:1469596337A inst:1469596341A lock:1469596341A sync:1469596341

千巷猫影

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

摇曳的蔷薇

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

拉风的咖菲猫

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

相关分类

Java