java - 调用同步方法的顺序

标签 java multithreading

我相信,这是一个简单的问题,但我自己仍然没有得到它。比如说,我有以下代码。

Runnable objectRunnable = new Runnable() {
    void run() {
          synchronized(object) {
              for (int i = 0; i < 5; i++) {
                  System.out.println("it's runnable");
                  Thread.sleep(100); 
              }
          }
    }
};

void doSomething() {
    synchronized(object) {
        for (int i = 0; i < 5; i++) {
            System.out.println("it's doSomething");
            Thread.sleep(100);
        }
    }
}

synchronized (object) {
    new Thread(objectRunnable).start();
}
object.doSomething();

所以,输出就像

it's doSomething
it's doSomething
it's doSomething
it's doSomething
it's doSomething
it's runnable
it's runnable
it's runnable
it's runnable
it's runnable

问题是为什么 doSomething() 位于线程之前?此外,如果我在同步块(synchronized block)之后多次调用对象方法,它们都会随后被调用,然后程序才会返回线程的内容。如果我用调用某些模拟对象方法来替换同步块(synchronized block)中的线程调用行,那么一切都会正常,并且按指定的顺序进行。

同步对象本身的方法在执行该对象上同步的任何线程之前是否具有某种优先级?

最佳答案

因为主线程是第一个获得锁的。它可能是生成的线程,您只是无法确定,尽管这种可能性要小得多,因为调用 start() 后线程需要一些时间才能真正开始运行。

关于你的问题的其余部分,它太模糊了,无法回答。

关于java - 调用同步方法的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39052744/

相关文章:

c++ - 在线程 A 中创建对象,在线程 B 中使用。需要互斥锁吗?

.net - Console.In.ReadLine(重定向的StdIn)卡住所有其他线程

java - 最大化内部框架

java - Spring在资源中找不到文件

java - 异步任务的线程池?

c++ - C++中的多线程队列销毁

Java在不同线程上锁定和解锁

java - 无法访问另一个类的方法

java - 我无法删除文件,因为它似乎是 'open'

java - 创建迷宫时 IndexOutofBounds 异常