在同步方法内部的线程中的同步块会发生什么?

守卫者

因此,基本上,如果您具有以下条件,将会发生什么:

class SyncTest {
    private final static List<Object> mObjectList = new ArrayList<Object>();

    public synchronized void mySyncMethod(Object object) {
        new Thread(new Runnable() {
            public void run() {
                synchronized (SyncTest.this) {
                    for (int i = 0; i < mObjectList.size(); i++) {
                        //Do something with object
                    }
                }
            }
        }).start();
    }
}
  1. 假设活动需要在不同的线程中运行,并在集合上进行迭代。因此,为什么要在具有不同对象的方法中创建线程。
  2. 这是“正确”的方法,还是有更好的方法?
  3. 这会带来任何威胁吗?
内森·休斯(Nathan Hughes)

重新入场不适用于这里。嵌套的唯一影响是允许内部类实例可以访问封闭的实例(包括使用的锁)。同步的两件事在不同的线程中调用。一旦创建了新线程,则调度程序必须先选择它才能运行,因此即使这些线程使用相同的锁,这似乎也不大可能在两者之间有很多重叠。

调用mySyncMethod的线程获取正在使用的SyncTest实例上的锁,然后创建一个新的Thread,启动它,然后释放该锁并继续进行。

之后,新线程启动后,它必须先获取启动它的SyncTest对象的锁,然后才能执行其run方法。如果其他人正在使用SyncTest上的锁(要么是刚刚创建该锁的线程,另一个在同一SyncTest实例上对mySyncMethod的调用,或者另一个在同一SyncTest实例上对mySyncMethod的另一个调用创建的线程),则它必须等待获得锁。然后,它对列表执行所有操作,到达方法的结尾并释放锁。

这里有很多问题:

  • 目前尚不清楚为什么您需要创建自己的线程而不是使用池,或者为什么创建方法需要同步并等待新线程启动才能释放其锁。

  • SyncTest对象上的锁没有封装,因此其他东西也可以获取它,目前尚不清楚什么东西在争夺该锁。

  • 由于列表被定义为静态类成员,因此您有多个SyncTest对象;您将拥有单独的线程,使同一列表混乱,但是使用了不同的锁,因此很难理解锁的含义。

但是,您所显示的不会死锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java线程同步方法

来自分类Dev

方法同步线程问题

来自分类Dev

同步块内部的同步块

来自分类Dev

在同步块中等待线程

来自分类Dev

当线程尝试同时调用静态和非静态同步方法时会发生什么?

来自分类Dev

CommonJS是同步的,但是如果调用异步函数会发生什么

来自分类Dev

如果线程在同步块内引发异常会发生什么

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

是否遍历在同步块中检索的列表是线程安全的?

来自分类Dev

同步Lambda调用-受到限制时会发生什么?

来自分类Dev

Java线程:同步块

来自分类Dev

同步ArrayList与同步方法块

来自分类Dev

当您在Swift中的同步队列中异步调度任务时会发生什么?

来自分类Dev

同步调用异步函数时被调用者的线程会发生什么

来自分类Dev

Java中的同步方法和同步块

来自分类Dev

在Java中,线程切换可以在同步块中发生吗?

来自分类Dev

在同步方法内部的线程中的同步块会发生什么情况?

来自分类Dev

同步块中的notify()

来自分类Dev

在同步块中等待线程

来自分类Dev

当几个线程试图调用相同的同步方法时会发生什么?

来自分类Dev

Java中的同步块与同步方法限定符

来自分类Dev

Java多线程同步块

来自分类Dev

为什么在同步块中得到IllegalMonitorException?

来自分类Dev

java线程同步块

来自分类Dev

同步块中的 sleep() 方法行为

来自分类Dev

main方法中的同步块

来自分类Dev

多线程中的同步块

来自分类Dev

如果我们将异步重置块与同步重置一起使用会发生什么?

来自分类Dev

如果我在“同步”之前关闭设备会发生什么?

Related 相关文章

热门标签

归档