image.png
image.png
image.png
image.png

解决方法

使用synchronized加锁方式

  1. package org.example.concurrency.test;
  2. import java.util.concurrent.TimeUnit;
  3. /**
  4. * @author huskyui
  5. */
  6. public class Test30 {
  7. static boolean run = true;
  8. static Object lock = new Object();
  9. public static void main(String[] args) {
  10. Thread t1 = new Thread(()->{
  11. while (run){
  12. // ....
  13. synchronized (lock){
  14. if (!run){
  15. break;
  16. }
  17. }
  18. }
  19. });
  20. t1.start();
  21. try {
  22. TimeUnit.SECONDS.sleep(1);
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. synchronized (lock){
  27. run = false;
  28. }
  29. }
  30. }

使用volatile,解决可见性问题

  1. package org.example.concurrency.test;
  2. import java.util.concurrent.TimeUnit;
  3. /**
  4. * @author huskyui
  5. */
  6. public class Test30 {
  7. volatile static boolean run = true;
  8. public static void main(String[] args) {
  9. Thread t1 = new Thread(()->{
  10. while (run){
  11. }
  12. });
  13. t1.start();
  14. try {
  15. TimeUnit.SECONDS.sleep(1);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. run = false;
  20. }
  21. }

volatile

volatile只用于一个写线程,多个读线程。只能解决可见性问题,不能保证原子性问题。不能解决指令交错
synchronized可以保证代码块中原子性以及代码块内的变量可见性。但是缺点是很重。

实际应用

image.png
image.png
我们可以看到锁住是beanDefinitionMap当时用的却是beanDefinitionNames.