线程很多人都知道,但是可能有时候很多人都不太明白
多线程
首先多线程很多人都知道,开启一个线程吗,但是要你细说又说不上来具体是个啥玩意,用一个实例讲解
@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值是一样的。
那么由此我们可以了解到,这确实不是一个线程安全的类,因为他们都需要操作这个共享的变量。其实要对线程安全问题给出一个明确的定义,还是蛮复杂的,我们根据我们这个程序来总结下什么是线程安全。
当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。