Java中的线程安全

线程安全问题之所以存在,本质原因是:
当多个线程访问同一个数据的时候,可能引起冲突。而且这些线程中至少有一个线程会改写这个数据时才会出现冲突,如果所有线程都只读不改写,则不会冲突。由于这个数据不只被一个线程访问,我们称这个数据为共享数据。

类中一般会出现三种数据:

  1. 静态成员变量
  2. 普通成员变量
  3. 方法里定义的局部变量(包括方法参数变量)。

对于第三种变量,不管是静态方法还是动态方法,都不会存在线程安全问题。原因是:
方法在执行的时候,方法里的局部变量都是存储在堆栈上的。而方法的堆栈分配,是在方法每次执行开始时系统分配的,所以即使是调用同一方法(不管是不是同一线程),所分配的堆栈也是不同的。

对于第二种变量,同一个类的不同的对象实例有不同的成员变量,所以多个线程如果可以确定是在操作不同的对象,就不会存在冲突。如果多个线程操作的是同一个对象实例,则需要考虑对类内普通成员变量操作的线程安全问题。

对于第三种变量,因为这种变量在内存中只有一个副本,所以无论什么时候操作这种变量都需要考虑线程安全问题。

你可能感兴趣的:(Java)