1.线程安全
多线程多次执行同样的代码,总能获得确定的结果,即不存在不确定的竞争,那么就称这段代码为Thread-safe.
2.如何线程安全地使用非安全对象
有些类是别人写的,自己不能再修改源码,那么如何做到安全地并发使用呢?
2.1 局部变量
2.2 加锁
2.3 为每个线程维护一个对象
2.4 例子
假设SimpleDateFormat是不安全的,为了安全地使用,对应上面的三种思路,示例解决方案见下。
package com.yichudu.yichuutil.date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtilThreadLocal {
static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
static final SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT);
static final ThreadLocal
tlSimpleDateFormat = new ThreadLocal<>();
public static String nowTimeThreadLocal() {
SimpleDateFormat sdf;
if ((sdf = tlSimpleDateFormat.get()) == null)
tlSimpleDateFormat.set(sdf = new SimpleDateFormat(TIME_FORMAT));
return sdf.format(new Date());
}
public static String nowTimeLocalVariable() {
SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT);
return sdf.format(new Date());
}
public synchronized static String nowTimeSynchronized() {
return sdf.format(new Date());
}
}