什么是线程安全的Java?

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

我很困惑,任何类是线程安全的。 我明白,如果任何类是线程安全的,那么它的方法(如同步)有一些具体的。 是对还是错? 请帮助我阐述它的意义。

正如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)的值读入到它自己的variablestmp中。 线程B完成整个方法,所以最后myInt = 1。返回1。 现在轮到A轮了。 线程A继续。 并添加1到tmp(线程A的tmp为0)。 然后将这个值保存在myInt中。 myInt又是1。

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

创build线程安全的方法在非平凡的情况下非常困难。 还有不less技巧。 在Java中,可以将方法标记为synchronized ,这意味着在给定的时间只有一个线程可以执行该方法。 其他线程排队等待。 这使得一个方法是线程安全的,但是如果在一个方法中有很多工作要做,那么这会浪费很多时间。 另一种技术是通过创build一个锁或信号量并locking这个小部分(通常称为关键部分)来“仅将方法的一小部分标记为同步” 。 甚至有一些方法被实现为无锁线程安全的,这意味着它们的构build方式使得多个线程可以同时通过它们而不会造成任何问题,当一个方法只执行一个时primefaces电话。 primefaces呼叫是不能被打断的呼叫,一次只能由一个线程完成。

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