什么是 java 中的线程安全?
2022-08-31 16:46:32
正如Seth所说,线程安全意味着方法或类实例可以同时由多个线程使用,而不会出现任何问题。
请考虑以下方法:
private int myInt = 0;
public int AddOne()
{
int tmp = myInt;
tmp = tmp + 1;
myInt = tmp;
return tmp;
}
现在线程和线程都想执行。但首先启动并将 的值读入 。现在由于某种原因,调度程序决定暂停线程并将执行推迟到线程。线程现在还将 (still) 的值读入它自己的变量 。线程完成整个方法,因此在最后。并被退回。现在又轮到Thread了。线程继续。并添加到( 是线程 )。然后将此值保存在 . 又是.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中,您可以将方法标记为已同步,这意味着在给定时间只有一个线程可以执行该方法。其他线程排队等待。这使得方法线程是安全的,但是如果方法中有很多工作要做,那么这会浪费很多时间。另一种技术是通过创建锁定或信号量并锁定此小部分(通常称为关键部分)来“仅将方法的一小部分标记为已同步”。甚至有一些方法被实现为无锁线程安全,这意味着它们的构建方式使多个线程可以同时通过它们而不会引起问题,当一个方法只执行一个原子调用时,情况可能就是这样。原子调用是不能中断的调用,一次只能由一个线程完成。
线程安全只是意味着它可以同时从多个线程使用而不会引起问题。这可能意味着对任何资源的访问都是同步的,或者其他任何方式。