什么是java中的线程安全?

Anu*_*uj 51 java thread-safety

可能重复:
线程安全是什么意思?

我很困惑任何类都是Thread安全的.我理解,如果任何类是线程安全的,那么它的方法有一些特定的(同步).是对还是错?请帮助我详细说明它的含义.

Roy*_* T. 147

正如Seth所说的线程安全意味着多个线程可以同时使用方法或类实例而不会出现任何问题.

请考虑以下方法:

private int myInt = 0;
public int AddOne()
{
    int tmp = myInt;
    tmp = tmp + 1;
    myInt = tmp;
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

现在线程A和线程B都想执行AddOne().但A首先启动并读取值myInt (0)tmp.现在由于某种原因,调度程序决定暂停线程A并将执行推迟到线程B.线程B现在还将myInt(仍然0)的值读入它自己的变量中tmp.线程B完成整个方法,所以最后myInt = 1.并1返回.现在A轮到我了.线程A继续.并增加了1tmp(tmp0线程A).然后保存这个值myInt.myInt又来了1.

所以在这种情况下,该方法AddOne()被调用了两次,但是因为该方法没有以线程安全的方式实现,myInt所以不是2正如预期的那样,而是1因为第二个线程myInt在第一个线程完成更新之前读取变量.

在非平凡的情况下创建线程安全方法非常困难.而且有很多技巧.在Java中,您可以将方法标记为已同步,这意味着在给定时间只有一个线程可以执行该方法.其他线程排队等候.这使得方法线程安全,但如果在方法中要做很多工作,那么这会浪费很多时间.另一种技术是通过创建锁或信号量来"仅将方法的一小部分标记为同步",并锁定这个小部分(通常称为临界区).甚至有一些方法被实现为无锁线程安全,这意味着它们的构建方式使得多个线程可以同时通过它们而不会引起问题,这可能是一种方法只执行一个方法的情况原子电话.原子调用是无法中断的调用,一次只能由一个线程完成.

  • 为了完整起见,也许值得明确指出,不改变状态的方法是线程安全的,无需任何额外的努力.例如`public double PI(){return 3.14; }` (8认同)
  • 不,正如我刚刚告诉你的那样,同步是一种让线程安全的"方法",但还有其他方法.您可以在StringBuffer源代码中查看它们使用的技术. (3认同)

Set*_*gie 39

线程安全只是意味着它可以同时从多个线程使用而不会引起问题.这可能意味着对任何资源的访问都是同步的,或者其他什么.

  • +1.这个答案是正确的,并且具体可以给出OP的背景.线程安全正是他所说的:让多个线程同时调用函数而没有问题的能力.什么构成"问题"以及如何实现保护是完全不同的问题,但没有单个问题或单个解决方案可以与"线程安全"互换使用. (5认同)
  • @Oded你说的是真的,但我认为你忽视了@ Seth的回答中"没有引起问题"的部分. (4认同)
  • 大多数代码可以同时从多个线程调用.不会使线程安全. (3认同)