线程安全(Thread Safety)和线程不安全(Thread Unsafe)是涉及多线程编程的概念,描述了在多个线程同时访问共享资源时的行为。这些资源可以是变量、数据结构、对象等。
线程安全(Thread Safety): 当多个线程并发访问共享资源时,如果无论线程之间的调度顺序如何,都能保证共享资源的正确性和一致性,那么这个共享资源就是线程安全的。线程安全的实现通常需要采用同步机制来保护共享资源,以防止多个线程同时修改或访问这些资源。
线程不安全(Thread Unsafe): 如果多个线程并发访问共享资源时,没有足够的同步机制来保护这些资源,就可能导致数据不一致、错误或意外的行为。线程不安全的情况下,线程之间的竞争可能会导致不可预测的结果。
考虑以下示例,使用一个非线程安全的计数器:
class Counter {
private int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
如果多个线程同时调用 increment 方法,由于没有同步机制,就会发生竞争条件,导致计数器值的不确定性。
为了确保线程安全,可以使用同步机制,例如使用 synchronized 关键字或使用线程安全的数据结构(如 java.util.concurrent 包中的类):
class ThreadSafeCounter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在上述代码中,使用 synchronized 关键字确保了对 increment 和 getCount 方法的互斥访问,从而避免了竞争条件和数据不一致的问题。
总结:
1、线程安全 线程安全: 就是多线程访问时,采⽤了加锁机制,当⼀个线程访问该类的某个数据时,进⾏保护,其他线程不能进⾏ 访问,直到该线程读取完,其他线程才可使⽤。不会出现数据不⼀致或者数据污染。 Vector 是⽤同步⽅法来实现线程安全的, ⽽和它相似的ArrayList不是线程安全的。
2、线程不安全 线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,⽽⽆写操作,⼀般来说,这个全局变量是线程安全的;若有多个 线程同时执⾏写操作,⼀般都需要考虑线程同步,否则的话就可能影响线程安全。