问题标签 [synchronized-block]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
78 浏览

java - 这个同步块是否需要?

对于多线程环境中的这段代码,是否需要同步(c)?

0 投票
6 回答
9443 浏览

java - 最好在 try 块内有一个同步块,还是在同步块内有一个 try 块?

例如,这样更好吗?

或者最好这样:

我想知道哪一个是最佳实践。显然考虑到我必须同步 try 块中的所有代码。我不是在谈论我只需要同步 try 内的部分代码的情况(在这种情况下,我认为在 try 内有同步块会更好)。我怀疑我必须同步所有 try 块的情况。

0 投票
2 回答
167 浏览

java - 与线程同步

我有一个两部分的问题...

  1. 我有一个类,其中有一个函数,在给定时间只能由任何一个线程访问。使它成为一个synchronized函数或一个synchronized块仍然允许多个线程,因为不同的线程在类中访问它。如何确保只有一个线程访问此代码?(见下面的代码示例)

  2. 使用同步函数,对该函数的调用会排队。有没有办法只允许最后一次调用函数来访问代码?因此,如果我当前有 Thread1 访问我的函数,则 Thread2 和 Thread3 尝试访问它(按此顺序),一旦 Thread1 完成,将只授予 Thread3 访问权限。

    /li>

谢谢你的帮助!

0 投票
2 回答
6882 浏览

java - 观察者、可观察和可运行。为什么同步块丢失监视器?

我正在尝试将类用作 Observer 和 Observable。此类将作为线程运行。在 run() 方法中,线程将等待并在获取事件后通知线程。有示例代码:

得到的输出是:

并且线程保持锁定。预期输出:

怎么了?为什么我在监视器释放之前进入同步块?PS 我有一个想法,问题是将观察者添加到 MyThread 对象,我可能会将观察者添加到 Thread 对象吗?但我怎么能做到这一点?

0 投票
4 回答
828 浏览

java - 只有一个同步点有可能发生死锁吗?

我有两个正在运行的线程调用几个方法(5 或 6),我在其中指定了同步块并仅使用一个对象来锁定它。只有一个同步点会有死锁的可能性吗?到目前为止,我还没有看到这样的情况,但仍然如此。感谢帮助。

0 投票
4 回答
115 浏览

java - 使用“this”与另一个对象作为同步块中的锁,等待和通知

我有两个代码块,一个等待另一个通知它。

奇怪的是,这样做时并没有等待通知:

我很好奇两组的区别,以及为什么第一组有效而另一组无效。请注意,这两个块以两种不同的方法驻留在两个不同的线程中(如果有帮助的话)。

我希望有人能解释为什么会这样。我编辑了我的问题,所以它会更详细。

0 投票
2 回答
434 浏览

java - Java synchronized statement

I need a threadsafe arraylist like this.

According to java doc, when using Collections.synchronizedList one needs to synchronize each access to the list. I'm not sure whether my synchronized blocks will do this?

  1. Is my use of synchronized blocks equivalent to

    /li>
  2. Should I use a ReentrantLock like this

    /li>
0 投票
8 回答
9968 浏览

java - 同步块不工作

这个练习直接来自 Kathy Seirra 和 Bert Bates 的 SCJP

同步代码块

在本练习中,我们将尝试同步一段代码。在该代码块中,我们将获得一个对象的锁,以便其他线程在代码块执行时无法修改它。我们将创建三个线程,它们都将尝试操作同一个对象。每个线程将输出一个字母 100 次,然后将该字母加一。我们将使用的对象是 StringBuffer。

我们可以在 String 对象上进行同步,但字符串一旦创建就无法修改,因此如果不生成新的 String 对象,我们将无法增加字母。最终输出应该有 100 个 As、100 个 Bs 和 100 个 Cs,所有这些都在不间断的行中。

  1. 创建一个类并扩展 Thread 类。
  2. 重写 Thread 的 run() 方法。这就是同步代码块的去向。
  3. 为了让我们的三个线程对象共享同一个对象,我们需要创建一个构造函数,该构造函数在参数中接受一个 StringBuffer 对象。
  4. 同步代码块将从第 3 步获得对 StringBuffer 对象的锁定。
  5. 在块内,输出 StringBuffer 100 次,然后递增 StringBuffer 中的字母。你可以查看第 6 章的 StringBuffer 方法来帮助解决这个问题。
  6. 最后,在 main() 方法中,使用字母 A 创建一个 StringBuffer 对象,然后创建我们类的三个实例并启动所有三个实例。

我已经为上述练习编写了以下课程(而不是 100 我正在打印 10 个字符)

我期待一个类似于以下的输出(10 As,10 Bs 和 10 Cs),但没有得到它。

相反,我得到了如下不同的输出,因为三个线程有机会在另一个线程完成之前进入循环。

我的问题是为什么 run 方法中的同步块不起作用?

0 投票
1 回答
184 浏览

java - 同步块的互斥访问

我的代码synchronized在循环中包含一个块,类似这样

还有另一个线程正在运行与同一个互斥锁同步的代码。上面的线程只读,另一个只写。写作线程被饿死了,所以更新没有通过。即使一两秒钟也可以,但是写作线程似乎被无限期地排除在外。

我可以肯定地知道,当这个循环执行时,另一个线程也试图获取互斥锁,我确实理解为什么在执行上述线程时它没有收到它,除了 while 循环到达其结束的时间,并重新开始新的迭代。

此时应该释放互斥锁,不是吗?此时不应该其他线程接收它吗?

谢谢

0 投票
2 回答
524 浏览

java - 如何正确退出字节码中的监视器?

我正在阅读 JVM 规范,试图弄清楚如何正确处理监视器。他们在相关部分给出的示例如下所示:

我无法弄清楚为什么需要第二个异常表条目。如果抛出异常,monitorexit我真的想再次尝试退出监视器吗?据我所知,可能抛出的异常是NullPointerExceptionand IllegalMonitorStateException