线程(一)线程安全和不安全

来源:互联网 发布:在数据库中存储的是 编辑:程序博客网 时间:2024/04/27 00:43

我们经常会听到有人数线程安全或者线程不安全之类的说法,但是到底什么是线程安全还是不安全呢,其实也没有什么神秘的,线程安全呢就是在我们的多线程开始执行我们代码的时候不管怎么执行都是获取到的结果是一样的,就是和单线程执行的结果一样,不过比单线程所使用的时间就是少(在多核CPU下);那么对应的就是线程不安全,顾名思义就是线程执行的时候返回的结果部保证每一次都是一样的,这个是因为我们是采用的多线程,多线程就是说一端程序可以进行多个流程,而且造成每一次数据结果不一样的一个罪魁祸首就是资源共享,进程中的资源该进程中的线程是共享的.....所以可能一个线程在执行的时候可能别的线程已经修改了该字段的状态或者该字段的值.....好了我们拉看一段线程不安全的代码:

1.首先我们可以创建一个线程类:Count

/** * Created by luyangli on 16-6-16. */public class Count {    private int num;    public void count() {            for (int i = 0; i < 10; i++) {                num += 1;            }            System.out.println(Thread.currentThread().getName() + ":" + num);    }}

我们可以看到有一个成员变量num,有一个for循环操作就是num每次就加一.

然后就是我们的测试类,我们启动10个线程:

/** * Created by luyangli on 16-6-16. * * 首先我们看一下线程不安全的一个例子 */public class Thread1 {    public static void main(String[] args) {        Runnable runnable = new Runnable() {            Count count = new Count();            @Override public void run() {                count.count();            }        };        for (int i = 0; i < 10; i++) {            new Thread(runnable).start();        }    }}

我们启动10个线程,每个线程去执行刚才的那个执行num的加一的操作,我们可以分析下我们期望的几日过是什么,我们的期望是我们启动的这10个线程,每一个都是进行num的加一操作我们的期望就是可以每个线程都去进行这个操作互不干扰,那么能不能打到我们的效果呢:

我们看一下执行结果:

Thread-0:20Thread-1:20Thread-2:30Thread-3:40Thread-4:50Thread-5:60Thread-6:70Thread-7:80Thread-8:90Thread-9:100

上面是我执行结果中的一种,为什么说是一种呢,因为还会出现更多种这样的情况,很明显了,没有达到我们的预期值,为什么呢就是应为线程执行是无序的,谁也没法预料到线程执行的时候发生的事情,还有一个就是资源的共享的,进程中的资源该进程的线程资源共享,这个造成了我们想要的结果 其实是没有保障的.0号线程在执行操作的时候1号线程也在操作该变量,所以就出现了上面的返回结果..这个就是线程不安全的.....至于危害我们显而易见,程序都不能得到我们想要的结果了,这段程序就不能使用...

0 0
原创粉丝点击