【问题标题】:Lock outside or inside Thread?锁定在线程外部还是内部?
【发布时间】:2017-06-26 01:52:57
【问题描述】:

我正在学习线程安全,但在网上搜索时似乎无法找到明确的答案。

这之间有什么区别和影响:

synchronized (lock) {
    new Thread () {
        public void run() {
            // critical section
        }
    }.start();
}

还有这个:

new Thread () {
    public void run() {
        synchronized (lock) {
            // critical section
        }
    }
}.start();

为了给你一个上下文,我正在编写一个小型实验室,方法是“每个请求一个线程”,所以每次调用该方法时,上述方法中的任何一个都会被执行到“关键部分”执行它是自己的线程。

那么在线程内部或外部加锁有影响吗?每个线程“继承”锁还是必须在每个线程内才能完全线程安全?

【问题讨论】:

  • 第一个没用。
  • 第一个在thread.start之后释放锁,第二个是正确的等待run method中的所有代码完成后再释放锁
  • 太棒了!谢谢:)
  • 为什么要在自己的线程中运行临界区?临界区的要点是只能同时在其中一个线程,那么为什么不在您所在的线程中运行该部分,而不是一个新线程呢?新线程没有任何好处,而且有很多缺点(需要更长的时间、更多的内存使用、更多的垃圾要收集)
  • 本来就是这样的。如果我给你完整的背景,你会明白的。这只是一个摘录;)

标签: java multithreading thread-safety locking


【解决方案1】:

同步只是意味着一次只有一个线程可以执行某部分代码

在第一个例子中,一次只有一个线程可以创建和启动一个新线程。但请注意,您没有保护关键部分(多个线程可以同时执行它们的“运行”方法)

synchronized (lock) {
    new Thread () {
        public void run() {
            // critical section
        }
    }.start();
}

在第二个例子中,多个线程可以创建并启动一个新线程,但每次只有一个线程可以执行临界区(受“锁”保护)

new Thread () {
    public void run() {
        synchronized (lock) {
            // critical section
        }
    }
}.start();

【讨论】:

  • 详细解释,你得到答案:)
猜你喜欢
  • 2010-09-20
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多