我很困惑任何类都是Thread安全的。我理解,如果任何类是线程安全的,那么它的方法有一些特定的(同步)。是对还是错?请帮助我详细说明它的含义。
答案 0 :(得分:141)
正如Seth所说,线程安全意味着多个线程可以同时使用方法或类实例而不会出现任何问题。
考虑以下方法:
private int myInt = 0;
public int AddOne()
{
int tmp = myInt;
tmp = tmp + 1;
myInt = tmp;
return tmp;
}
现在线程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中,您可以将方法标记为 synchronized ,这意味着在给定时间只有一个线程可以执行该方法。其他线程排队等候。这使得方法线程安全,但如果在方法中要做很多工作,那么这会浪费很多时间。另一种技术是通过创建一个锁或信号量来锁定这个小部分(通常称为临界区),'仅将方法的一小部分标记为同步'。甚至有一些方法被实现为无锁线程安全,这意味着它们的构建方式使得多个线程可以同时通过它们而不会引起问题,这可能是一种方法只执行一个方法的情况原子电话。原子调用是无法中断的调用,一次只能由一个线程完成。
答案 1 :(得分:37)
线程安全只是意味着它可以同时从多个线程使用而不会引起问题。这可能意味着对任何资源的访问都是同步的,或者其他任何内容。