• JUC_回顾多线程


    什么是JUC

    JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!

    是面试的高频考点

    进程与线程

    进程:

    1.程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的
    2.当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
    3.进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

    线程:

    1.一个进程之内可以分为一到多个线程
    2.一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
    3.Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。 在windows 中进程是不活动的,只是作为线程的容器

    以QQ举例,QQ.exe启动就是一个进程的启动,你点击QQ的聊天就调用了QQ的一个线程,一个进程可以包含一个或多个线程,至少包含一个线程。

    面试题:

    Java默认有几个线程?

    有两个线程,一个主线程(main),一个GC线程(垃圾回收)

    Java 真的可以开启线程吗?

    不能,java调用底层的C++,执行本地方法,详细如下

    public synchronized void start() {
    /**
    * This method is not invoked for the main method thread or "system"
    * group threads created/set up by the VM. Any new functionality added
    * to this method in the future may have to also be added to the VM.
    *
    * A zero status value corresponds to state "NEW".
    */
    if (threadStatus != 0)
    throw new IllegalThreadStateException();
    /* Notify the group that this thread is about to be started
    * so that it can be added to the group's list of threads
    * and the group's unstarted count can be decremented. */
    group.add(this);
    boolean started = false;
    try {
    start0();
    started = true;
    } finally {
    try {
    if (!started) {
    group.threadStartFailed(this);
    }
    } catch (Throwable ignore) {
    /* do nothing. If start0 threw a Throwable then
    it will be passed up the call stack */
    }
    }
    }
    // 本地方法,底层的C++ ,Java 无法直接操作硬件
    private native void start0();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    并发与并行

    并发编程:并发、并行

    并发(多线程操作同一个资源)

    • CPU 一核 ,模拟出来多条线程,天下武功,唯快不破,快速交替

    并行(多个人一起行走)

    • CPU 多核 ,多个线程可以同时执行; 线程池

    并发编程的本质:充分利用CPU的资源

    线程有几个状态

    创建、运行、阻塞、等待、终止

    public enum State {
    // 创建
    NEW,
    // 运行
    RUNNABLE,
    // 阻塞
    BLOCKED,
    // 等待,死死地等
    WAITING,
    // 超时等待
    TIMED_WAITING,
    // 终止
    TERMINATED;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    线程中wait/sleep 区别

    1、来自不同的类

    wait => Object

    sleep => Thread

    2、关于锁的释放

    wait => 会释放锁

    sleep => 不会释放锁

    sleep可以想成你睡觉的时候抱着锁睡着了,释放不了锁;wait只是在等待,是醒着的,可以释放锁

    3、使用的范围是不同的

    wait => 必须在同步代码块中使用

    sleep => 可以在任何地方使用

    JUC的结构

    在这里插入图片描述

    一、tools(工具类):又叫信号量三组工具类,包含有

    1)CountDownLatch(闭锁) 是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待

    2)CyclicBarrier(栅栏) 之所以叫barrier,是因为是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 ,并且在释放等待线程后可以重用。

    3)Semaphore(信号量) 是一个计数信号量,它的本质是一个“共享锁“。信号量维护了一个信号量许可集。线程可以通过调用 acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。

    二、executor(执行者):是Java里面线程池的顶级接口,但它只是一个执行线程的工具,真正的线程池接口是ExecutorService,里面包含的类有:

    1)ScheduledExecutorService 解决那些需要任务重复执行的问题

    2)ScheduledThreadPoolExecutor 周期性任务调度的类实现

    三、atomic(原子性包):是JDK提供的一组原子操作类

    包含有AtomicBoolean、AtomicInteger、AtomicIntegerArray等原子变量类,他们的实现原理大多是持有它们各自的对应的类型变量value,而且被volatile关键字修饰了。这样来保证每次一个线程要使用它都会拿到最新的值。

    四、locks(锁包):是JDK提供的锁机制,相比synchronized关键字来进行同步锁,功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁包含的实现类有:

    1)ReentrantLock 它是独占锁,是指只能被独自占领,即同一个时间点只能被一个线程锁获取到的锁。

    2)ReentrantReadWriteLock 它包括子类ReadLock和WriteLock。ReadLock是共享锁,而WriteLock是独占锁。

    3)LockSupport 它具备阻塞线程和解除阻塞线程的功能,并且不会引发死锁

    五、collections(集合类):主要是提供线程安全的集合, 比如:

    1)ArrayList对应的高并发类是CopyOnWriteArrayList,

    2)HashSet对应的高并发类是 CopyOnWriteArraySet,

    3)HashMap对应的高并发类是ConcurrentHashMap等等

  • 相关阅读:
    【【萌新的FPGA学习之按键控制蜂鸣器之消抖介绍】】
    Package和Activity
    大数据入门之hadoop学习
    Redis Cluster集群方案
    Java使用正则表达式判断是否包含:数字、字母、特殊字符、中文
    eval()函数的用法,计算字符串中的值,模板字符串进行计算
    编写一个函数,输入一个十进制数,输出对应 的十六进制数。(不能用printf的%x格式说明符)
    Postman接口自动化测试实例
    【java】【项目实战】[外卖十二]【完结】项目优化(前后端分离开发)
    飞机大战(python)
  • 原文地址:https://blog.csdn.net/qq_57581439/article/details/126949147