Java多线程
文章平均质量分 60
Java多线程
小镇攻城狮
吃饭的家伙要拿稳咯
展开
-
【多线程】3种获取多线程的方法
1 继承Thread类(用得最少,一般都是面向接口编程)class MyThread01 extends Thread { @Override public void run() { }}2 实现Runnable接口class MyThread02 implements Runnable { @Override public void run() { }}3 Callable接口与Runnable接口的区别:方法有返回值;方法会原创 2021-08-20 17:38:09 · 258 阅读 · 0 评论 -
【Java多线程】阻塞队列(BlockingQueue接口)
1 阻塞队列的好处定义:阻塞队列首先是一个队列。当阻塞队列为空时,从队列中获取元素的操作将会被阻塞;当阻塞队列为满时,往队列里添加元素的操作将会被阻塞。阻塞:在多线程领域,阻塞就是在某些情况下会挂起线程;一旦条件满足,被挂起的线程又会自动被唤醒。BlockingQueue:使用的好处是不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,都交给它去处理,不需要手动管理。2 不得不阻塞,如何管理2.1 ArrayBlockingQueue由数组结构组成的有界阻塞队列。2.2 Link原创 2021-08-20 16:44:00 · 315 阅读 · 0 评论 -
【设计模式】多线程下的生产者消费者模式
版本1syn + wait + notify版本2lock + await + signalAll多线程下编程口诀:线程 操作(方法) 资源类判断(多线程的判断必须要使用while,不能使用if) &n原创 2021-08-20 15:53:59 · 145 阅读 · 0 评论 -
【Java多线程】Synchronized与Lock有什么区别
题目:synchronized和Lock有什么区别?用新的Lock有什么好处?你举例说说1 原始构成synchronized是关键字,属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或方法中才能调wait/notify等方法)monitorexitLock是具体类(接口)(java.util.concurrent.locks.Lock),是api层面的锁2 使用方法synchroni原创 2021-08-20 14:47:44 · 108 阅读 · 0 评论 -
【Java多线程】CountDownLatch、CyclicBarrier、Semaphore
1 CountDownLatch让一些线程阻塞,直到另一些线程完成一系列操作后,才被唤醒。案例Demo:秦灭六国,一统华夏import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch =原创 2021-08-19 10:36:40 · 143 阅读 · 0 评论 -
【Java多线程】锁机制
1 公平锁和非公平锁1.1 定义公平锁是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序。有可能后申请的线程比先申请的线程优先获取锁。在高并发的情况下,有可能会造成优先级反转或者饥饿现象。并发包中ReentrantLock的创建,构造函数不指定参数的话,默认是非公平锁。Synchronized也是一种非公平锁。Lock lock = new ReentrantLock();1.2 区别公平锁:在并发环境原创 2021-08-18 20:53:38 · 393 阅读 · 0 评论 -
【多线程】CAS
1 原理UnSafe类是CAS的核心类,UnSafe类存在于sun.misc包中。UnSafe类中的所有方法都是native修饰的,即UnSafe类中的方法都直接调用操作系统底层资源执行相应任务。CAS全称为Compare-And-Swap,它是一条CPU并发原语。用来判断内存某个位置的值是否为预期值,如果是,则更改为新的值。否则继续比较,直到主内存和工作内存中的值一致为止。CAS是一种完全依赖于硬件的功能。原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,原创 2021-08-17 22:14:25 · 93 阅读 · 0 评论 -
【多线程】AQS类
1 概念AQS类,全称abstractQueuedSynchronizer。路径在java.util.concurrent.locks包下。AQS是一个用来构建锁和同步器的类。ReentrantLock、Semaphore等都是基于AQS的。2 原理如果被请求的共享资源空闲,则将线程设置为有效的工作线程,将共享资源设置为锁定状态。如果请求的共享资源被占有,将线程加入到CLH队列中。设置一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制是用CLH队列锁实现的。...原创 2021-05-14 15:41:52 · 225 阅读 · 0 评论 -
【多线程】Atomic原子类
文章目录1 概念2 相关的类2.1 基本类型2.2 数组类型2.3 引用类型2.4 对象的属性修改类型1 概念原子类就是具有原子特征的类。多个线程一起执行时,一个操作一旦开始,就不会被其他线程干扰,线程安全2 相关的类java.util.concurrent包(JUC包)的原子类都放在java.util.concurrent.atomic包下。2.1 基本类型AtomicInteger:整形原子类AtomicLong:长整型原子类AtomicBoolean:布尔型原子类2.2原创 2021-05-14 10:30:15 · 148 阅读 · 0 评论 -
【多线程】线程池
文章目录1 池化技术2 示例1 池化技术线程池、数据库连接池、Http连接池等等,都是为了减少获取资源的消耗,提高对资源的利用效率2 示例参考资料JavaGuide公众号文章原创 2021-05-14 10:06:32 · 2564 阅读 · 0 评论 -
【多线程】ThreadLocal类
1 概念ThreadLocal是一个类,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会拥有这个变量的副本。使用get()和set()方法来获取值和设置值。2 示例import java.util.Random;public class ThreadLocalDemo implements Runnable { private static final ThreadLocal<Integer> value = new ThreadLocal<>(原创 2021-05-13 15:41:58 · 2551 阅读 · 0 评论 -
【多线程】volatile关键字
1 概念volatile关键字的主要作用是保证变量的可见性,防止指令重排。2 并发编程的三个特性原子性:一个或一组操作,要么都执行,要么都不执行。synchronized保证了原子性。可见性:一个线程对共享变量进行了修改,其他线程可以立即看到修改后的新值。volatile保证了可见性。有序性: 代码的执行顺序未必是编写代码时的顺序。3 volatile与synchronized的区别volatile更轻量级,性能比synchronized好volatile只能修饰变量,sync原创 2021-05-13 11:37:29 · 2596 阅读 · 0 评论 -
【多线程】synchronized关键字
文章目录1 概念2 修饰的对象3 双重校验锁实现单例模式4 底层原理4.1 同步语句块查看字节码操作4.2 同步方法1 概念synchronized关键字解决的是线程访问资源的同步性的问题。synchronized可以保证被它修饰的代码块或方法在任意时刻只有一个线程执行。2 修饰的对象实例方法:作用于当前对象实例加锁。静态方法:作用于当前类加锁。访问静态synchronized方法占用的是当前类的锁,访问非静态synchronized方法占用的锁是当前实例对象的锁,不会发生互斥。代码块:作原创 2021-05-13 10:40:09 · 2516 阅读 · 2 评论 -
【多线程】线程死锁
线程A拥有资源2,请求资源1;线程B拥有资源1,请求资源2。导致互相等待,进入死锁。public class Test { private static Object resource1 = new Object(); private static Object resource2 = new Object(); public static void main(String[] args) { new Thread(() -> { .原创 2021-05-12 19:48:07 · 1944 阅读 · 0 评论 -
【多线程】线程上下文切换
线程的CPU时间片用完后,会先保存当前的状态,以便下次切换回来后,可以再加载这个状态。从保存到再加载的过程就是一次上下文切换。上下文切换会消耗大量的CPU时间。原创 2021-05-12 17:27:35 · 2250 阅读 · 0 评论 -
【多线程】线程的生命周期和状态
一共有6个状态:NEW、RUNNABLE、WAITING、TIME_WAITING、BLOCKED、TERMINATED线程创建后处于NEW(新建)状态,调用start()方法开始运行,线程处于READY(就绪)状态,获取到CPU时间片后处于RUNNING(运行)状态。READY和RUNNING统称为RUNNABLE状态。程序执行wait()方法后,进入WAITING(等待)状态。需要依靠其他线程的通知才能返回运行状态。通过sleep(long mills)方法或者wait(long mills.原创 2021-05-12 17:03:54 · 145 阅读 · 2 评论 -
【多线程】进程与线程、并行与并发
1 进程进程是程序的一次执行过程。Java中,启动main函数就是启动了一个JVM进程,main函数所在的线程称为主线程。2 线程一个进程在执行过程中,可以产生多个线程。import java.lang.management.ManagementFactory;import java.lang.management.ThreadInfo;import java.lang.management.ThreadMXBean;public class Test { public stati原创 2021-05-12 15:48:59 · 73 阅读 · 0 评论