多线程与线程安全

线程很多人都知道,但是可能有时候很多人都不太明白

多线程

首先多线程很多人都知道,开启一个线程吗,但是要你细说又说不上来具体是个啥玩意,用一个实例讲解

   @Test
    public void test06(){

        Thread thread = new Thread(new MyThread());
        thread.start();
        for (int i = 1; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
public class MyThread implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}    

按照程序由上往下,这个输出结果因该是先打印Thread1-100,在打印main1-100
但是实际上
先打印了mian,然后打印Thread,中间还有交互打印的
说好的顺序执行代码呢??
这就是多线程,两个线程一起跑,线程抢占,程序会一会执行这个线程,一会执行那个线程,哪个线程在执行,就运行哪个
在这里插入图片描述
在这里插入图片描述

线程安全

多线程明白了,那我这段代码应该是两个线程交互的去跑吧,交互的累加

    private static int count = 1;
    @Test
    public void test07(){
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 50; i++) {
                    count++;
                    System.out.println(Thread.currentThread().getName() +"-" + count);
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i < 50; i++) {
                    count++;
                    System.out.println(Thread.currentThread().getName() +"-"+ count);
                }
            }
        });
        thread.start();
        thread2.start();
    }

然而出现了两个3,后面也没有2

Thread-1-3 Thread-0-3 Thread-1-4 Thread-0-5 Thread-1-6 Thread-0-7 Thread-1-8 
Thread-0-9 Thread-1-10 Thread-0-11 Thread-1-12 Thread-0-13 Thread-1-14 Thread-0-15 
Thread-1-16 Thread-0-17 Thread-1-18 Thread-0-19 Thread-1-20 Thread-1-22 
Thread-0-21 Thread-1-23 Thread-1-25 Thread-1-26 Thread-1-27 Thread-0-24 
Thread-0-29 Thread-0-30 Thread-0-31 Thread-0-32 Thread-0-33 Thread-0-34 
Thread-0-35 Thread-0-36 Thread-0-37 Thread-0-38 Thread-0-39 Thread-0-40 
Thread-0-41 Thread-0-42 Thread-0-43 Thread-1-28 Thread-0-44 Thread-1-45 
Thread-1-47 Thread-1-48 Thread-1-49 Thread-1-50 Thread-1-51 Thread-1-52 
Thread-1-53 Thread-1-54 Thread-1-55 Thread-1-56 Thread-1-57 Thread-1-58 
Thread-1-59 Thread-1-60 Thread-1-61 Thread-1-62 Thread-1-63 Thread-1-64 
Thread-1-65 Thread-1-66 Thread-1-67 Thread-1-68 Thread-1-69 Thread-1-70 
Thread-1-71 Thread-1-72 Thread-1-73 Thread-1-74 Thread-1-75 Thread-1-76 
Thread-1-77 Thread-1-78 Thread-0-46 Thread-0-79 Thread-0-80 Thread-0-81 
Thread-0-82 Thread-0-83 Thread-0-84 Thread-0-85 Thread-0-86 Thread-0-87 
Thread-0-88 Thread-0-89 Thread-0-90 Thread-0-91 Thread-0-92 Thread-0-93 
Thread-0-94 Thread-0-95 Thread-0-96 Thread-0-97 Thread-0-98 Thread-0-99 

这就是线程安全问题
想要了解线程安全,看下面的线程安全的原因

原因

出现这种问题的原因有很多。

最常见的一种,就是我们A线程在进入方法后,拿到了count的值,刚把这个值读取出来,还没有改变count的值的时候,结果线程B也进来的,那么导致线程A和线程B拿到的count值是一样的。

那么由此我们可以了解到,这确实不是一个线程安全的类,因为他们都需要操作这个共享的变量。其实要对线程安全问题给出一个明确的定义,还是蛮复杂的,我们根据我们这个程序来总结下什么是线程安全。

当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orange大数据技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值