乐趣区

关于java:JUC引例小黄人抢香蕉引发的思考

根底概念
线程 & 过程
并发 & 并行

  • 线程 & 过程

官网个别是这样定义的:线程(thread)是操作系统可能进行运算调度的最小单位,它被蕴含在过程之中,是过程中的理论运作单位。

说人话,间接上图. 咱们关上电脑管家就是一个 ** 过程 **。而点击杀毒性能运行就是开启了一个 ** 线程 **。不用繁琐,要害明确一个过程可能蕴含多个线程即可。

  • 并发 & 并行

Erlang 之父 Joe Armstrong 用一张 5 岁小孩都能看懂的图解释了并发与并行的区别

艰深来讲,对于计算机而言,就是判断多个线程是否在同时抢夺一块 CPU 资源。如果是,则 并发 。如果不是,则 并行 。理解这些基本概念后,当多个线程同时竞争一块资源时。咱们提出一个新的概念叫 高并发。也即秒杀、限量抢购等是用同一个情理

背景引例

如果多个小黄人同时抢 10 只香蕉,(这里用 Bob, Dave, Stuart 代表多个)。这个过程其实就是高并发。

咱们将香蕉作为 资源类 ,每一个小黄人称为一个 线程 ,抢香蕉的过程称为 线程操作资源类。用一段简略的 java 小程序模仿实现这个过程。

代码实操

  1. 定义一个资源类 Banana(香蕉)
class Banana {

 private int number = 10; // 现有香蕉一只
 Lock lock = new ReentrantLock(); // 锁
 
 public void stolen() {    // 被抢走
        lock.lock();
         try {if (number > 0) {System.out.println(Thread.currentThread().getName()        
            + "t 抢到【" + (number--) + "】残余:【" +
            number + "】只香蕉!");
            }
         } catch (Exception e) {e.printStackTrace();
         } finally {lock.unlock();
         }
    }
}

2 . 线程操作资源类 Main(抢香蕉过程)

public class Main {public static void main(String[] args) {Banana banana = new Banana();
         //Lamabada 表达式开启三个线程
         new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
         }},"Bob").start();)new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
         }},"Dave").start();
         new Thread(()->{ for (int i = 0; i < 15; i++) {banana.stolen();
         }},"Stuart").start();}
 
}

运行成果

再次运行

多运行几次

运行后果截然不同。由此可见,线程的调度是随机的。

小结

  1. 理解线程、过程、并发的概念
  2. 理解线程调度的随机性
  3. 学习 Lamada 表达式的利用
  4. 引出并发场景下 JUC 的利用

【END】
有道无术,术可求。有术无道,止于术。

退出移动版