今天就来讲讲多线程之线程安全问题,什么是线程安全问题,当多个线程同时共享一个全局变量做写的操作的时候,可能会受到其他线程的干扰,就会产生线程安全问题,导致数据出现脏读。
产生的原因:同时做写的操作。同时做写的操作。同时做写的操作,重要的事说三遍,
如何解决了,核心思想:在同一个时刻,只有一个线程执行,那么这个时候整个程序就变成单线程执行的了,俗话说的好,事情都有两面性,虽然保证了线程的安全性,但是执行效率却大大降低了,你想想,一群马过独木桥快,还是一匹马过桥快,显而是一群马,但是一点都不安全,随时都有可能掉到河里,被大水冲走,一匹马过桥,虽然整体影响大部队的效率,但是稳啊,咱们做人做事不就是求一个稳吗。
java中如何解决线程安全问题
Lock锁。sysnchronized, cas无锁等等
Synchronized加锁之后如何保证线程安全问题的。
首先要有一把锁,在多个线程中,同时执行同一个方法的时候,首先要获取到锁,只有获取到锁的情况下,才可以进入到该方法执行,就像上厕所,只有抢到锁上的钥匙才能进去方便。
那么Synchronized在什么情况下释放:run方法 码执行完毕或者程序跑出异常的情况下自动释放锁。
Synchronized使用方式:代码块形式:
@Override
public void run() {
synchronized (this){
//线程要执行的代码
}
}
注意:使用到Synchroized锁的时候可以使用任意对象锁作为锁。如果在方法上加上Synchroized关键字默认使用this锁。
@Override
public static void run() {
synchronized (Test.class){
//线程要执行的代码
}
}
如果方法是一个静态方法,就使用当前类的Class字节码作为锁。