一.原子操作类
1.Atomic+基本数据类型的封装类
举例:AtomicInteger 解决了多个线程对同一个静态的变量进行改动,所产生的并发问题
举例代码:
public class Demo2 {
private static AtomicInteger atomicInteger = new AtomicInteger(0); //创建原子整数类
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
for (int i = 0; i < 5000; i++) {
atomicInteger.getAndIncrement();
}
});
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5000; i++) {
atomicInteger.getAndDecrement();
}
});
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(atomicInteger);
}
}
二.线程安全集合类
1.现有的线程安全的类
StringBuffer 线程安全
String 不可变类 , 都是线程安全的
Random 线程安全
Vector 实现了List,并且线程安全
Hashtable 实现了Map,并且线程安全
2.新增的线程安全集合类
ConcurrentHashMap 实现了Map,并且线程安全
ConcurrentSkipListMap 实现了Map(可排序),并且线程安全
CopyOnWriteArrayList 实现了List,并且线程安全
有关ThreadLocal的代码
// 线程局部变量
private static ThreadLocal<SimpleDateFormat> local = new ThreadLocal() {
@Override // 初始值
protected Object initialValue() {
return new SimpleDateFormat("yyyy-MM-dd"); // 存入当前线程
}
};
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
SimpleDateFormat sdf = local.get(); // 获取本线程自己的局部变量
Date date = sdf.parse("1951-10-09"); // 每个线程使用的是自己的SimpleDateFormat因此没有争用
System.out.println(Thread.currentThread().getName() + " " + date);
} catch (ParseException e) {
e.printStackTrace();
}
}).start();
}
也解决了线程的并发问题