解决方法
使用synchronized加锁方式
package org.example.concurrency.test;
import java.util.concurrent.TimeUnit;
/**
* @author huskyui
*/
public class Test30 {
static boolean run = true;
static Object lock = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(()->{
while (run){
// ....
synchronized (lock){
if (!run){
break;
}
}
}
});
t1.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock){
run = false;
}
}
}
使用volatile,解决可见性问题
package org.example.concurrency.test;
import java.util.concurrent.TimeUnit;
/**
* @author huskyui
*/
public class Test30 {
volatile static boolean run = true;
public static void main(String[] args) {
Thread t1 = new Thread(()->{
while (run){
}
});
t1.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
run = false;
}
}
volatile
volatile只用于一个写线程,多个读线程。只能解决可见性问题,不能保证原子性问题。不能解决指令交错
synchronized可以保证代码块中原子性以及代码块内的变量可见性。但是缺点是很重。
实际应用
我们可以看到锁住是beanDefinitionMap当时用的却是beanDefinitionNames.