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继续.并增加了1对tmp(tmp为0线程A).然后保存这个值myInt.myInt又来了1.
所以在这种情况下,该方法AddOne()被调用了两次,但是因为该方法没有以线程安全的方式实现,myInt所以不是2正如预期的那样,而是1因为第二个线程myInt在第一个线程完成更新之前读取变量.
在非平凡的情况下创建线程安全方法非常困难.而且有很多技巧.在Java中,您可以将方法标记为已同步,这意味着在给定时间只有一个线程可以执行该方法.其他线程排队等候.这使得方法线程安全,但如果在方法中要做很多工作,那么这会浪费很多时间.另一种技术是通过创建锁或信号量来"仅将方法的一小部分标记为同步",并锁定这个小部分(通常称为临界区).甚至有一些方法被实现为无锁线程安全,这意味着它们的构建方式使得多个线程可以同时通过它们而不会引起问题,这可能是一种方法只执行一个方法的情况原子电话.原子调用是无法中断的调用,一次只能由一个线程完成.
Set*_*gie 39
线程安全只是意味着它可以同时从多个线程使用而不会引起问题.这可能意味着对任何资源的访问都是同步的,或者其他什么.