例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操作就会发生类变量读写错误,即便是在类方法前加上synchronized也无效,因为同一个线程在两次调用方法之间时锁是被释放的,这时其它线程可以访问对象的类方法,读取或修改类变量。这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。

解决方案 »

  1.   


    public class Test{
    public static void main(String[] args) throws Exception{ Thread t1 = new Thread(new ThreadTest(10));
    t1.start();
    Thread t2 = new Thread(new ThreadTest(20));
    t2.start();
    Thread t3 = new Thread(new ThreadTest(30));
    t3.start();
    Thread t4 = new Thread(new ThreadTest(40));
    t4.start();
    Thread t5 = new Thread(new ThreadTest(50));
    t5.start();
    }
    }
    class ThreadTest implements Runnable{
    public static int i = 0;

    public ThreadTest(int i){
    ThreadTest.setI(i);
    } public void run(){
    System.out.println(ThreadTest.getI());
    } public static int getI() {
    return i;
    } public static void setI(int i) {
    ThreadTest.i = i;
    }
    }
    多执行下以上代码,输出的不是10 20 30 40 50