1. 多线程的数据安全
2. 同步线程的方法
1. 多线程的数据安全
1 class MyThread implements Runnable{
2 int i = 100;
3 public void run(){
4 while(true){
5 System.out.println(Thread.currentThread().getName()+i);
6 i--;
7 Thread.yield();
8 if(i<0){
9 break;
10 }
11 }
12 }
13 }
1 class Test{
2 public static void main(String args []){
3 MyThread myThread = new MyThread();
4 //生成两个Thread对象,但这两个Thread对象共用同一个线程体
5 Thread t1 = new Thread(myThread);
6 Thread t2 = new Thread(myThread);
7
8 //每个线程都可以设置名字 或 获取名字
9 t1.setName("线程a");
10 t2.setName("线程b");
11
12 t1.start();
13 t2.start();
14 }
15 }
代码看似结果会是
线程a100-->线程b99-->线程a98-->线程b97-->...
但也会有可能数据安全问题
产生线程a100--->线程b100--->线程b98 的可能的原因是:
线程a100
: System.out.println(Thread.currentThread().getName()+i);
还没到 i-- , 线程b就开始执行了
线程b100:
System.out.println(Thread.currentThread().getName()+i);
线程a : i--
线程b: i--
线程b98
:System.out.println(Thread.currentThread().getName()+i);
因此 多线程共用同一份数据时, 有可能产生数据安全问题
2. 同步线程的方法
解决上述问题, 同步线程
1 class MyThread implements Runnable{
2 int i = 100;
3 public void run(){
4 while(true){
5 synchronized(this){ //同步锁, 线程会一直执行到线程锁里面的代码执行完毕
6 System.out.println(Thread.currentThread().getName()+i);
7 i--;
8 Thread.yield();
9 if(i<0){
10 break;
11 }
12 }
13 }
14 }
15 }
Java当中的线程(三)
时间: 2024-10-06 05:31:03