是不是只要不调用全局变量(这种变量是有状态的),就不存在同步问题啊。

解决方案 »

  1.   

    shi de   ni shuo dui le 
      

  2.   

    举个例子,像这样就是不安全的:public class DateUtil {    private final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");    public static String formatDate(Date date) {
            return DATE_FORMAT.format(date);
        }
    }因为 DATE_FORMAT 是静态属性,因此只有一个实例,并发时会被多个线程同时访问,根据 API 文档,可以知道 SimpleDateFormat 不是一个线程安全的类,因此这段代码在 formatDate 方法会产生线程安全问题,在多线程请求处理的情况下会导致 SimpleDateFormat 内部的状态出错。
      

  3.   

    如果是这样的话,就是线程安全的了:public class DateUtil {    public static String formatDate(Date date) {
            return new SimpleDateFormat("yyyy-MM-dd").format(date);
        }
    }因为局部变量会在 JVM 的线程栈中处理,而 JVM 的线程栈是每个线程隔离的,因此这里不会有线程安全问题。
      

  4.   

    还可以借助于 ThreadLocal 弄成某个线程共享一个实例的方式,以避免多线程安全问题:import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class DateUtil {    private final static ThreadLocal<DateFormat> formats = new ThreadLocal<DateFormat>() {
                protected DateFormat initialValue() {
                    return new SimpleDateFormat("yyyy-MM-dd");
                }        
            };    public static String formatDate(Date date) {
            return formats.get().format(date);
        }
    }