- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Possible Duplicate:
What does threadsafe mean?
我很困惑任何类都是线程安全的。我的理解是,如果任何类是线程安全的,那么它的方法有一些特定的(如同步的)。是对还是错?请帮助我详细说明它的含义。
最佳答案
正如 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
(对于线程 A
,tmp
是 0
)。然后将此值保存在 myInt
中。 myInt
又是 1
。
所以在这种情况下,方法 AddOne()
被调用了两次,但是由于该方法不是以线程安全的方式实现的,所以 myInt
的值不是 2
,正如预期的那样,但是 1
因为第二个线程在第一个线程完成更新之前读取了变量 myInt
。
在不平凡的情况下,创建线程安全的方法非常困难。并且有不少技巧。在 Java 中,您可以将方法标记为 已同步,这意味着在给定时间只有一个线程可以执行该方法。其他线程排队等候。这使得方法线程安全,但是如果方法中有很多工作要做,那么这会浪费很多时间。另一种技术是'将方法的一小部分标记为同步',方法是创建一个锁或信号量,并锁定这小部分(通常称为临界区)。甚至有一些方法被实现为无锁线程安全,这意味着它们的构建方式使得多个线程可以同时通过它们而不会引起问题,这可能是一个方法只执行一个的情况原子调用。原子调用是不能中断的调用,一次只能由一个线程完成。
关于java - java中的线程安全是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6324085/
我是一名优秀的程序员,十分优秀!