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

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();
    }
}
  • 说, Activity 需要在不同的线程中运行,并在集合上进行迭代。因此,为什么要在具有不同对象的方法中创建线程。
  • 这是“正确”的方法,还是有更好的方法?
  • 这会带来任何威胁吗?
  • 最佳答案

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

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

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

    这里有很多问题:

  • 目前尚不清楚为什么您需要创建自己的线程而不是使用池,或者为什么create方法需要同步并等待新线程启动才能释放其锁。
  • SyncTest对象上的锁未封装,因此其他东西可能会获取它,目前尚不清楚争夺该锁的是什么。
  • 由于该列表被定义为静态类成员,因此您有多个SyncTest对象;因此,您可以使用它。您将拥有单独的线程,使同一列表混乱,但是使用了不同的锁,因此很难理解锁的含义。

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

    07-24 09:47
    查看更多