根据我在Java类中的知识
- 非静态同步方法:锁定特定对象的获取
- 静态同步方法:锁定类上的获取
我对此有点困惑,因为我们可以通过类名或对象名来调用静态方法.
请假设有4种方法,我的班级都是同步的.2个方法是静态的,2个是非静态的.如果我将创建我的类"obj1"的1个对象,并且还有2个线程Thread1和Thread2
问题1:如果我将尝试使用obj1(或类名)访问静态同步方法.这是否意味着"obj1"没有锁定只会锁定2个静态方法(类级别锁定)?意味着其他线程可以同时使用"obj1"访问非静态方法但不能访问静态方法吗?
问题2:如果我将尝试使用Thread1中的obj1 来访问非静态同步方法.这是否意味着Thread2只锁定了2个方法?表示Thread2可以访问2个静态方法,或者我们可以同时使用className(MyClass)访问静态方法
问题3:如果我班级中的所有方法都是静态的并且是同步的.这是否意味着没有对象级别锁定,并且所有线程只有一个类级别锁定.?
请解释一下关于班级锁定的一点点
提前致谢.
Kay*_*man 12
即使你用静态方法调用
someObject.staticMethod()
Run Code Online (Sandbox Code Playgroud)
它不会改变锁定在Class对象上的事实.它只是意味着你以一种令人困惑的方式调用静态方法,你应该正确地调用它.仅仅因为它完美地运行,并不意味着它应该被使用(除非你打算使你的代码更不易读).
类级别锁没有什么特别之处.它只使用Class对象而不是实例,并且由于所有静态同步都使用相同的Class对象,因此它的工作方式与此类似.
至于你的上一个问题,是的.如果您只有静态同步方法,则无论您创建的类的实例数是多少,它们都将共享Class对象作为其锁.