哪位高手能帮小弟我解释关于线程安全的一句话
谁能帮我解释关于线程安全的一句话
例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操作就会发生类变量读写错误,即便是在类方法前加上synchronized也无效,因为同一个线程在两次调用方法之间时锁是被释放的,这时其它线程可以访问对象的类方法,读取或修改类变量。这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。
------解决方案--------------------
例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操作就会发生类变量读写错误,即便是在类方法前加上synchronized也无效,因为同一个线程在两次调用方法之间时锁是被释放的,这时其它线程可以访问对象的类方法,读取或修改类变量。这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。
------解决方案--------------------
- Java code
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; } }