多线程的线程安全问题一直是很多人都在谈论的问题,下面就该问题来发表一下我所学习到以及对该方面的见解.
说到线程安全问题,那就需要先说一下线程中的数据共享,尤其是在多个线程之间进行交互时尤为重要.
- 不共享的情况属于多个线程对数据操作时,数据之间是不共通,互不影响的.
- 共享类似于多个线程共通操作一个私有变量,任何一个线程都可以对其进行操作,例如一个线程对这个数据进行增添,而其他的线程对这个数据进行删减.因此也就会引发线程安全问题.- 处理这种线程安全问题的方法就是通过在run方法前加入Synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理,类似于对该方法进行了排队,在执行该方法前先判断是否有线程在执行该方法,如果有,那就等待执行完毕后在执行,每次只能有一个进行执行.
- synchronized可以在任意对象及方法上加锁,加锁的这段代码成为”互斥区”或”临界区”
非线程安全主要是指多个线程对同一个对象的同一个实例变量进行操作时会出现值被更改,值不同步的问题,从而影响程序的执行流程.
- 在参考资料时,有一个案例是,println()方法与i–或i++联合使用时,有可能会出现异常情况,我将其摘取下来供大家参考:
代码如下:
package com.demo2;
public class ThreadDemo1 implements Runnable{
@Override
public void run() {
System.out.println("i : "+(i--)+" __ ThreadName :"+Thread.currentThread().getName());
}
private Integer i=5;
public static void main(String[] args) {
ThreadDemo1 thread = new ThreadDemo1();
Thread thread1 = new Thread(thread);
Thread thread2 = new Thread(thread);
Thread thread3 = new Thread(thread);
Thread thread4 = new Thread(thread);
Thread thread5 = new Thread(thread);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
测试目的:虽然println()方法在内部是同步的,但是i–的操作却是在进行println() 之前发生的,所以有发生线程安全的问题概率.
为了防止非线程安全问题,还是继续使用同步方法吧~