JUC前置知识

这篇具有很好参考价值的文章主要介绍了JUC前置知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JUC前置知识

JUC概述

在开发语言中,线程部分是重点,JUC是关于线程的。JUC是java.util.concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。

线程和进程

线程和进程的概念
进程(process): 是计算机的程序关于某数据集合上的一次允许活动,是操作系统进行资源分配和任务调度的最小单位,是操作系统的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。
线程(thread): 是操作系统或CPU核心能够进行调度的最小单位。被包含在进程中,是进程中的实际运行单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以有多个线程,每个线程执行不同的任务。

总结

进程,是在系统中正在运行的一个应用程序,程序一旦运行就是进程,也是操作系统资源分配的最小单位。
线程,是CPU(Central Processing Unit缩写)核心(现代计算机的CPU可以有多个CPU核心,俗称的4核,8核等)进行资源调度的最小单位,或者说进程内独立执行的一个执行流单元,也是程序执行的最小单位。

线程的状态

线程状态类
public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
     	//新建
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
     	//准备就绪,可以运行
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
     	//阻塞
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
     	//等待,不见不散
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
     	//定时等待,过时不候
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
     	//停止,终止
        TERMINATED;
    }

wait和sleep方法的区别

  • 1.sleep是Thread类的静态方法,wait是Object类的方法,任何对象实例都能调用。
  • 2.sleep不会释放锁,也不需要占有锁。wait会释放锁,但释放锁这个动作的前提是,当前线程占有锁。
  • 3.这两个方法都可以被interrupted方法中断。
  • 4.这两个方法还有个特点,就是线程在哪里被阻塞,就在哪里被唤醒。
串行,并行和并发
串行模式

串行表示所有任务一一按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这三个步骤,才能进行下一步骤。串行是一次只能取得一个任务,并执行这个任务。

并行模式

并行意味着可以同时取得多个任务,,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。并行的效率从代码层次上,强依赖于多进程/多线程代码,从硬件角度上依赖于多核CPU。

并发

指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。
并发的重点是一种现象,描述的是多进程同时运行的现象。但实际上,一个CPU同时,只能运行一个线程。所以同时运行,不是同一时刻有多个线程运行的现象,而是提供一种功能,让用户看起来多个程序同时运行了,但是实际上的线程不是一直霸占CPU的,而是执行一会停,一会执行。
要解决大并发问题,通常是将大任务分解成多个小任务,由于OS(Operating System)对进程的调度是随机的,所以切分成多个小任务后,可能会从任一小任务出执行。可能出现的问题,一个小任务执行了多次,还没开始下个任务。这时一般会采用队列或类似数据结构来存放各个小任务的成果。可能出现还没准备好第一步,就执行第二步的可能。这时,一般采用多路复用或异步的方式,比如只有准备好了,才产生事件执行下一步任务。可以多进程/多线程的方式并行执行这些小任务。也可以单进程/单线程执行这些小任务,这是很可能要配合多路复用才能达到较高的效率。

小结

并发:同一时刻多个线程在访问同一资源,多个线程对一个点。如春运抢票,电商秒杀。
并行:多项工作一起执行,之后再汇总。如泡泡面,水壶烧水,一边放调料。

管程

管程又叫Monitor(监视器),在OS中叫管程/Monitor(监视器),在Java中叫锁(Lock)。
锁其实是一种同步机制,保证同一时间内,只能有一个线程访问受保护的资源。
在JVM中实现这个锁机制(同步机制),是通过进入,退出管程对象实现的,也就是常说的持有锁,和释放锁。进入管程(拥有锁),退出管程(释放锁)。一个线程持有该锁,就只有当前线程可以访问,该锁保护的资源。释放锁,就是当前线程不访问,该锁保护的资源了,其他线程可以竞争该锁,谁获取到锁,可以访问锁保护的线程。

用户线程和守护线程

daemon n.守护神
用户线程和守护线程,是jvm中的概念。
用户线程,顾名思义,用户自定义的线程。主线程结束,用户线程还在运行,jvm存活。
守护线程 ,用于守护用户线程,执行的线程如垃圾回收(gc)。没有用户线程,都是守护线程的话,主线程结束,jvm结束。设置一个线程为守护线程,必须在开启这个线程之前。

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());// aa true
            while(true){

            }
        },"aa");
        thread.setDaemon(true);//通过该方法可将线程设置为守护线程
        thread.start();

        System.out.println(Thread.currentThread().getName() + "over");// mainover
    }
}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。文章来源地址https://www.toymoban.com/news/detail-711084.html

到了这里,关于JUC前置知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JUC之线程、线程池

    start方法开启一个新线程,异步执行。 run方法同步执行,不会产生新的线程。 start方法只能执行一次,run方法可以执行多次。 sleep() 线程睡眠 两种方式调用: 线程打断 interrupt()这种方式打断,线程会抛出InterruptedException异常。比如在线程睡眠的时候,调用interrupt(),线程抛出

    2024年04月27日
    浏览(27)
  • 多线程---JUC

    JUC是:java.util.concurrent这个包名的缩写。它里面包含了与并发相关,即与多线程相关的很多东西。我们下面就来介绍这些东西。 Callable接口类似与Runnable接口: Runnable接口:描述的任务是不带返回值的。 callable接口:描述的任务是带返回值的,存在的意义就是让我们获取到结果

    2024年02月07日
    浏览(27)
  • 多线程(进阶三:JUC)

    目录 一、Callable接口 1、创建线程的操作 2、编写多线程代码 (1)实现Runnable接口(使用匿名内部类) (2)实现Callable接口(使用匿名内部类) 二、ReentrantLock 1、ReentrantLock和synchronized的区别 2、如何选择使用哪个锁? 三、原子类 四、线程池 五、信号量 Semaphore 代码示例 六、

    2024年02月20日
    浏览(23)
  • Java基础-多线程&JUC-线程池和自定义线程池

    主要核心原理 不推荐Executors创建没有上线的线程池,建议使用自定义的线程池; Java工具类创建线程池; 当只有3个任务时,直接上处理机运行; 当有6个任务时,任务1-3上处理机运行,任务4-6进入阻塞队列等待; 当有9个任务时,任务1-3上处理机运行,任务4-6进入阻塞队列等

    2024年02月12日
    浏览(30)
  • 「JUC并发编程」初识CAS锁(概述、底层原理、原子引用、自旋锁、缺点)

    概述 CAS的全称为 Compare-And-Swap ,直译就是 对比交换 。是一条 CPU的原子指令 ,其作用是让CPU 先 进行比较两个值是否相等, 然后 原子地更新某个位置的值。经过调查发现,其实现方式是 基于硬件平台的汇编指令 ,就是说CAS是靠硬件实现的, JVM只是封装了汇编调 用,那些

    2024年02月16日
    浏览(38)
  • 5.多线程之JUC并发编程2

    1.CompletableFuture异步回调 像ajax,未来再得到执行结果,想服务器不分先后顺序执行,可以用异步回调 2.JMM 面试:对 Volatile的理解 答: Volatile是jvm通过轻量级的同步机制,比sychronized更轻 1.保证可见性 2.不保证原子性 3.禁止指令重排 什么是JMM? 答:java内存模型,是一种规定,不存在的东西

    2024年02月08日
    浏览(31)
  • 线程系列 7 - JUC高并发容器类

               早期的同步容器一般使用 Vector、HashTable、java.util.Collections ,这些同步容器实现线程安全的方式是:在需要同步访问的方法上添加synchronized。        synchronized 在线程没有发生争用的场景下处于偏向锁的状态,其性能是非常高的。但是,一旦发生了线

    2024年02月15日
    浏览(37)
  • 3.多线程之JUC并发编程0

    1.学习方法 java1.8才有juc 面试高频问 源码+官方文档 //怎么用多线程,如果是没有返回结果的就单独开一条线程,或者使用线程池,如果有返回值的就用callable 2.什么是juc 三个包 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 介绍 Callable性能比Runnable高,并且Runnable没有返

    2024年02月08日
    浏览(42)
  • JUC面试(五)——Collection线程不安全

    当我们执行下面语句的时候,底层进行了什么操作 new ArrayListInteger(); 底层创建了一个空的数组,伴随着初始值为10 当执行add方法后,如果超过了10,那么会进行扩容,扩容的大小为原值的一半,也就是5个,使用下列方法扩容 Arrays.copyOf(elementData, netCapacity) 单线程环境 单线程环

    2023年04月23日
    浏览(22)
  • JUC并发编程学习笔记(十)线程池(重点)

    线程池:三大方法、七大参数、四种拒绝策略 池化技术 程序的运行,本质:占用系统的资源!优化资源的使用!- 池化技术(线程池、连接池、对象池......);创建和销毁十分消耗资源 池化技术:事先准备好一些资源,有人要用就拿,拿完用完还给我。 线程池的好处: 1、

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包