关于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】
有道无术,术可求。有术无道,止于术。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理