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

守卫者

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

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

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

来自分类Dev

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

来自分类Dev

在catch块中返回语句会发生什么情况

来自分类Dev

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

来自分类Dev

调用exec()时,线程会发生什么情况?

来自分类Dev

等待加入条件变量的线程会发生什么情况?

来自分类Dev

从C中main返回时正在运行的线程会发生什么情况?

来自分类Dev

结束后在进程中启动的线程会发生什么情况

来自分类Dev

从C中main返回时,正在运行的线程会发生什么情况?

来自分类Dev

当多次执行同一块时,块中的softSelf和StrongSelf会发生什么情况?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

如果尝试并最终在方法中返回布尔值,会发生什么情况

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

如果多个用户想要修改Oracle数据库中的相同数据块,会发生什么情况

来自分类Dev

如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

来自分类Dev

多线程中的同步块

来自分类Dev

挂起负责处理消息的线程时,会发生什么情况?

来自分类Dev

当进程结束时,在Sleep()中间的线程会发生什么情况?

来自分类Dev

等待条件变量的线程持有的互斥锁会发生什么情况

来自分类Dev

当原始类超出范围时,线程会发生什么情况

来自分类Dev

如果线程执行的函子被移动,会发生什么情况?

来自分类Dev

同步块内部的同步块

来自分类Dev

当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

来自分类Dev

当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

来自分类Dev

RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

来自分类Dev

如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    在catch块中返回语句会发生什么情况

  4. 4

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

  5. 5

    调用exec()时,线程会发生什么情况?

  6. 6

    等待加入条件变量的线程会发生什么情况?

  7. 7

    从C中main返回时正在运行的线程会发生什么情况?

  8. 8

    结束后在进程中启动的线程会发生什么情况

  9. 9

    从C中main返回时,正在运行的线程会发生什么情况?

  10. 10

    当多次执行同一块时,块中的softSelf和StrongSelf会发生什么情况?

  11. 11

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

  12. 12

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

  13. 13

    在Git中删除分支时会发生什么情况

  14. 14

    如果尝试并最终在方法中返回布尔值,会发生什么情况

  15. 15

    将属性应用于python中的类方法时会发生什么情况?

  16. 16

    如果多个用户想要修改Oracle数据库中的相同数据块,会发生什么情况

  17. 17

    如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

  18. 18

    多线程中的同步块

  19. 19

    挂起负责处理消息的线程时,会发生什么情况?

  20. 20

    当进程结束时,在Sleep()中间的线程会发生什么情况?

  21. 21

    等待条件变量的线程持有的互斥锁会发生什么情况

  22. 22

    当原始类超出范围时,线程会发生什么情况

  23. 23

    如果线程执行的函子被移动,会发生什么情况?

  24. 24

    同步块内部的同步块

  25. 25

    当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

  26. 26

    当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

  27. 27

    RabbitMQ Java客户端:当在使用者的handleDelivery()方法中抛出RuntimeException时会发生什么情况?

  28. 28

    如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

  29. 29

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

热门标签

归档