java - 一个单独的线程可以继续执行另一个线程同步的对象吗?

标签 java multithreading

假设我有一个对象 A,它有 2 个方法:

public doSomething()
{....}

public synchronised doSomethingElse()
{ ... }

并且我有thread1.doSomethingElse()thread2.doSomething()仍然可以执行还是被thread1的锁阻塞了?

如果是这样,如何让thread1同时执行?

最佳答案

同步有两种类型 1. 对象级别 2.类级别(类级别同步仅适用于静态方法。)

在您的情况下,由于您的方法不是静态的,所以它是对象级同步。对于对象级同步,您可以同步整个方法,也可以同步方法的某些 block 。

当您同步一个方法时。这意味着类的同一对象无法从不同线程访问同步方法。由于每个对象只有一个锁。如果您为相同的 obj 但从不同的线程调用了 doSomethingElse() 。然后它就可以被一个线程访问。

现在给出你的答案: 由于您的第一个方法不同步,即 Something()。在任何情况下,如果您为任何线程调用它,甚至当您的第一个线程当前位于该方法中时调用它,它都不会受到影响。 锁仅适用于同步方法

Yourclass obj = new Yourclass();
Thread A = new MyThread(obj);
Thread B =  new MyThread(obj);

……

public void run()
{
  \\do what ever you want
   \\both of your methods will be called.
   \\ call them both here.
}

在这里,我创建了相同 Mythread 类的对象,您可以按照您的意愿进行操作。您可以创建两个不同实现的线程类的对象并编写您的运行。 无论如何,它都不会对通话产生影响。

关于java - 一个单独的线程可以继续执行另一个线程同步的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576059/

相关文章:

Java - 如何限制从特定方法调用方法

c# - 如何将参数从控制台应用程序 c# 传递到正在运行的进程?使用wcf?

java - 线程、对象状态

java - javac 是否根据底层操作系统执行任何字节码级别的优化?

java - 如何使用 Spring Data Neo4j 将 Map (java.util.Map) 对象保留在 NodeEntity 中?

java - 如何在 Android 中以最佳方式调整位图大小?

c# - ConfigureAwait 将继续推送到池线程

Java:为什么线程不会终止

c# - 信号量 - 初始计数有什么用?

java - 如何更新 JTable