Java 线程安全同步块

Java 线程安全同步块,java,thread-safety,Java,Thread Safety,关于线程同步,我有些困惑。考虑到我有两个线程THEAD1和THEAD2以及两种方法同步的Foo1和FoO2。foo1是同步方法,而foo2不是,在foo1内部有一个调用foo2的语句,如果Thread1调用foo1,并且它在foo2方法中工作,那么Thread2希望直接访问未同步的foo2方法 所以我的问题是 Thread2是否可以访问Foo2?或者它将等待Thread1完成其任务?如果foo2未同步,任何线程都可以随时调用它而不会被阻止。一个线程是否从另一个本身已同步的方法调用它没有任何区别。

关于线程同步,我有些困惑。考虑到我有两个线程THEAD1和THEAD2以及两种方法同步的Foo1和FoO2。foo1是同步方法,而foo2不是,在foo1内部有一个调用foo2的语句,如果Thread1调用foo1,并且它在foo2方法中工作,那么Thread2希望直接访问未同步的foo2方法

所以我的问题是
Thread2是否可以访问Foo2?或者它将等待Thread1完成其任务?

如果foo2未同步,任何线程都可以随时调用它而不会被阻止。一个线程是否从另一个本身已同步的方法调用它没有任何区别。

如果foo2未同步,任何线程都可以随时调用它而不会被阻止。线程是否从另一个自身已同步的方法调用它没有任何区别。

Thread2不会被阻止,也不会等待。
它将开始执行Foo2,因为它没有同步。

Thread2不会被阻止,也不会等待。
它将开始执行Foo2,因为它没有同步。

锁定的是对象,而不是方法。这意味着,如果两个线程正在访问不同的对象,那么可以在foo1中使用这两个线程。如果它们正在访问同一个对象,那么无论先调用什么或调用什么,同一个锁都将阻止并发访问


顺便说一句:foo1可以调用自己,因为它已经有了锁。

锁定的是对象,而不是方法。这意味着,如果两个线程正在访问不同的对象,那么可以在foo1中使用这两个线程。如果它们正在访问同一个对象,那么无论先调用什么或调用什么,同一个锁都将阻止并发访问


顺便说一句:foo1可以调用自己,因为它已经拥有锁。

Thread2可以直接调用foo2,因为foo2不是一个同步方法,所以任何线程都可以调用它,而不会获取当前对象的监视器。

Thread2可以直接调用foo2,因为foo2不是一个同步方法,因此,任何线程都可以调用它,而不会获取当前对象的监视器。

建议尽可能发布一段简短的代码片段,以准确地说明/再现您的问题。是的,我确实按照这些说明进行操作,感谢您的快速回复。建议尽可能发布一段简短的代码片段,为了准确地说明/再现您的问题。是的,我确实按照这些说明进行操作,谢谢您的快速回复。一个混乱的原因是该方法被标记为已同步,但它不是被锁定的方法;为了扩展Peter Lawrey的评论,public synchronized void foo{…}实际上意味着public void foo{…}synchronized这{…}@Anonymoose,s/synconized/synchronized/A混淆的原因是该方法被标记为synchronized,但它不是被锁定的方法;为了扩展Peter Lawrey的评论,public synchronized void foo{…}实际上意味着public void foo{synchronized this{…}}@Anonymoose,s/synconized/synchronized/