当前位置:   article > 正文

轻松应对Java并发 JUC全方位详解

轻松应对Java并发 JUC全方位详解

1. JUC 简介

  • 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,
    用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中
    的 Collection 实现等;

2. volatile 关键字

  • volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种
    较为轻量级的同步策略;
  • volatile 不具备"互斥性";
  • volatile 不能保证变量的"原子性";
  1. // 使用 volatile 之前
  2. public class TestVolatile{
  3. public static void main(String[] args){
  4. ThreadDemo td = new ThreadDemo();
  5. new Thread(td).start();
  6. while(true){
  7. if(td.isFlag()){
  8. System.out.println("########");
  9. break;
  10. }
  11. }
  12. }
  13. }
  14. class ThreadDemo implements Runnable{
  15. private boolean flag = false;
  16. public void run(){
  17. try{
  18. // 该线程 sleep(200), 导致了程序无法执行成功
  19. Thread.sleep(200);
  20. }catch(InterruptedException e){
  21. e.printStackTrace();
  22. }
  23. flag = true;
  24. Sytem.out.println("flag="+isFlag());
  25. }
  26. public boolean isFlag(){
  27. return flag;
  28. }
  29. public void setFlag(boolean flag){
  30. this.flag = flag;
  31. }
  32. }

  1. // 解决问题方式一: 同步锁
  2. // 但是,效率太低
  3. public class TestVolatile{
  4. public static void main(String[] args){
  5. ThreadDemo td = new ThreadDemo();
  6. new Thread(td).start();
  7. while(true){
  8. // 使用同步锁
  9. synchronized(td){
  10. if(td.isFlag()){
  11. System.out.println("########");
  12. break;
  13. }
  14. }
  15. }
  16. }
  17. }
  18. // 解决方式二: 使用 volatile 关键字
  19. public class TestVolatile{
  20. public static void main(String[] args){
  21. ThreadDemo td = new ThreadDemo();
  22. new Thread(td).start();
  23. while(true){
  24. if(td.isFlag()){
  25. System.out.println("########");
  26. break;
  27. }
  28. }
  29. }
  30. }
  31. class ThreadDemo implements Runnable{
  32. private volatile boolean flag = false;
  33. 同上(略)
  34. }
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/966838
推荐阅读
相关标签
  

闽ICP备14008679号