前言
关于线程问题基本上贯穿学习的整个过程,像集合,servlet,structs,hibernate,spring等等,其都涉及到线程问题
线程安全
什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全
不妨来一个实例
首先是number类,里面有一个计数的全局和静态变量
显然我们希望每个线程都能输出的结果是55就是线程安全
线面是测试类:
这里启动十个线程,依次通过run方法输出全局和静态变量的累加和,如果是线程安全的,则应该都是55
结果如下所示
Thread-0:55
statis:
Thread-0:55
Thread-1:110
statis:
Thread-1:110
Thread-2:165
statis:
Thread-2:165
Thread-6:275
statis:
Thread-6:220
Thread-3:385
statis:
Thread-4:220
statis:
Thread-3:275
Thread-8:385
statis:
Thread-8:385
Thread-4:330
Thread-5:440
statis:
Thread-5:440
Thread-7:495
statis:
Thread-7:495
Thread-9:550
statis:
Thread-9:550
发现不是线程安全的
线程不安全
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
对于上面的线程不安全可以进行如下修改
解决方法:将全局变量变成局部变量(静态变量暂时不讨论)
最后所有的线程都输出了55
或者将new 的number放到run里面,变成局部的
最后也能保证了线程安全了