场景1。
同步方法是私有的,位于实现 Runnable 的类中
Main.java
public class Main {
Thread thread1 = new Thread(new MyRunnable);
. . .
}
MyRunnable.java
public class MyRunnable implements Runnable {
. . .
private synchronized doSomething {
}
场景2。
同步方法是公共和静态的,位于 Main 类中
Main.java
public class Main {
Thread thread1 = new Thread(new MyRunnable);
public synchronized static doSomething() {
}
}
MyRunnable.java
public class MyRunnable implements Runnable {
. . .
}
问题:以上哪种情况是正确的?
我遵循第二种情况。所以我在主类中有一个同步的方法。这很好。当我将这个同步方法移动到MyRunnable类时,我没有看到任何不同。这很奇怪。我预料它会失败。< code>synchronized防止同时访问此方法。
但如果我声明一个类的两个实例:
MyRunnable runnable1 = new MyRunnable();
MyRunnable runnable2 = new MyRunnable();
每个运行项都有自己的同步
,同步
对编译器没有任何意义。我理解正确吗?
< code>synchronized定义运行时行为。它在编译时不做任何事情。
同步
方法锁定在对象的实例上(this
)。
静态同步方法锁定在对象的类
上。
此行为在JLS§8.4.3.6中定义。同步
方法
同步方法在执行前获取一个监视器(17.1)。
对于类(静态)方法,使用与方法类的class对象关联的监视器。
对于实例方法,使用与此相关联的监视器(为其调用方法的对象)。
因此,在场景1中,该方法针对MyRunnable
的每个单独实例被锁定,而在场景2中,该方法被锁定在Main上。class
object(或多或少是全局的,在同一类加载器下是相同的)。
在*场景1中考虑这一点:
MyRunnable runnable = new MyRunnable();
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
这里,t1和t2都使用相同的MyRunnable
实例,这意味着它们将无法并行执行doSomething()
。
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
这里,t1和t2可以在MyRunnable
的实例上执行doSomething()
,因为它们锁定了实例。
在场景2中,两个线程都不能在paralell中执行do
问题内容: 我的问题是我是否有类似以下代码: 现在,当多个线程要调用内部类方法时,它们将获取外部类对象或内部类对象的锁,并且如何修改该语句,以便我同步对外部类对象的访问/ 问题答案: 当多个线程要调用内部类方法时,它们将获取外部类对象的锁 没有。 或用于内部类对象 是。 以及如何修改该语句,以便我同步访问外部类对象/ 加: 在方法内部,但请注意,内部锁先于外部锁获取,如语法现在建议的那样。一致的锁
问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译
我在阅读oracle的多线程官方教程时,遇到了这个例子(假设< code>c1和< code>c2从未一起使用): 据说通过使用锁1 然而,我并不认为这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。 有人可以帮助解释我的困惑吗?喜欢用一个例子来说明差异。 除了这里的讨论,这篇文章也帮助澄清了我的疑虑。要点:将sy
Java中,任何对象都可以作为锁,并且 wait(),notify()等方法用于等待对象的锁或者唤醒线程,在 Java 的线程中并没有可供任何对象使用的锁,所以任意对象调用方法一定定义在Object类中。 wait(), notify()和 notifyAll()这些方法在同步代码块中调用 有的人会说,既然是线程放弃对象锁,那也可以把wait()定义在Thread类里面啊,新定义的线程继承于Thr
问题内容: 限制条件: 我有一个编写的Maven源代码生成器,它是从具有嵌套名称空间的某些数据文件创建POJO类的。我希望每个名称空间都嵌套为一个内部类。在某些情况下,我最终会得到内部类,这些内部类与最外部类的简单名称相同。 所有类都必须是作用域,因为这是对类型安全包装器的覆盖,例如属性文件,但是是分层的。 我不能更改名称,否则我将更改名称含义和包含数据的名称空间。 给出比我有以下代码: 内部类应
我最近了解到,Sun/Oracle最新的指导方针规定,任何Swing对象的Swing方法(包括构造函数)都不能在EDT之外调用。 http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-rovidens-creating-swing-components-on-the-edt.html 引用:“除了实际的线程安全和相关的问题,如