
Java多线程
文章平均质量分 71
有关java中多线程的一些问题
拥抱月光
这个作者很懒,什么都没留下…
展开
-
java实现生产者消费者模式
文章目录为什么要使用生产者和消费者模式什么是生产者消费者模式多生产者和多消费者场景线程池与生产者消费者模式为什么要使用生产者和消费者模式生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三原创 2021-01-28 16:34:17 · 1315 阅读 · 0 评论 -
对ReentrantLock的认识?
文章目录概述功能整体结构概述顾名思义,ReentrantLock是重入锁。它实现了Lock接口,是基于AQS(一种用于构建同步器的框架)构造出来的一种同步器。功能同synchronized一样,ReentrantLock也是可重入的,与synchronized相比增加了一些高级功能,主要有以下三项:等待可中断、可实现公平锁、锁可以绑定多个条件等待可中断:是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可中断特性对处理执行时间非常长的同步块很有帮助。公平锁原创 2021-01-28 15:42:15 · 201 阅读 · 0 评论 -
什么是公平锁&非公平锁&区别?
文章目录公平锁非公平锁公平锁多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量下降会很多,队列里面除了第一个线程,其他线程都会阻塞,cpu唤醒阻塞线程的开销会很大。非公平锁多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。优点:可以减少cpu唤醒线程的开销,整体的吞吐率会高点,cpu也不必唤醒所有线程,会减少唤醒线程的数量缺点:可能导致原创 2021-01-28 14:54:21 · 361 阅读 · 0 评论 -
如何保证线程数据安全问题?
文章目录一、不可变(final)二、线程封闭三、同步悲观锁非阻塞同步(乐观锁)四、工具类总结首先看一张图片一、不可变(final)在Java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。final关键字修饰的类或数据不可修改,可靠性最高。如String类,Integer类。二、线程封闭把对象封装到一个线程里,只有一个线程能看到这个对象,那么这个对象就算不是线程安全的,也不会出现任何线程安全方面的问题。线程封闭有三种:Ad-h原创 2021-01-28 14:19:29 · 645 阅读 · 3 评论 -
Timer和ScheduledThreadPoolExecutor的区别?
文章目录Timer和ScheduledThreadPoolExecutor的区别Timer和ScheduledThreadPoolExecutor的区别两者都可以完成任务的定时执行,但是,阿里巴巴推荐使用定时线程池ScheduledThreadPoolExecutor,为什么呢?先看一段代码 Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override原创 2021-01-28 09:50:28 · 265 阅读 · 0 评论 -
有关Java中线程池的问题
文章目录一、线程池二、线程池的优势三、什么时候使用线程池?四、线程池架构图五、线程池的五种状态六、ThreadPoolExecutor默认线程池七、线程池七大参数八、线程池的工作原理九、线程池抛异常会如何?十、execute的执行流程十一、ScheduledThreadPoolExecutor定时线程池十二、定时线程池的三种任务提交方式,以及区别一、线程池“线程池”,顾名思义就是一个线程缓存,线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,因此Java中提供线程池对线程进行原创 2021-01-27 18:44:16 · 631 阅读 · 0 评论 -
线程死锁的原因&如何避免死锁
文章目录线程死锁的现象线程死锁的四个条件避免死锁的方法线程死锁的现象两个或者两个以上的线程在执行过程中,因资源争夺而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直互相等待而无法继续运行下去。线程死锁的四个条件互斥条件资源只能被一个线程占用,如果其他线程请求获取该资源,则请求者只能等待,直到占用资源的线程释放该资源请求并持有条件指一个线程已经持有了至少一个资源,但又提出了新的资源请求,而新的资源已被其他线程占用,所以当前线程会被阻塞,但阻塞的同时不释放自己获取的资源不可剥夺条件原创 2021-01-27 15:24:33 · 401 阅读 · 0 评论 -
CAS与Volatile
文章目录CASvolatilecas的特点为什么无锁效率高CAS全称是Compare And Swap 即比较和交换,是乐观锁的一种实现一个取钱的例子:public class TestAccount { public static void main(String[] args) { Account account = new AccountCas(10000); Account.demo(account); }}class AccountC原创 2020-11-04 14:22:13 · 1266 阅读 · 1 评论 -
有关volatile关键字
文章目录内存屏障(Memory Barrier(Memory Fence))volatile 原理单例模式双重校验锁优化内存屏障(Memory Barrier(Memory Fence))可见性写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中而读屏障(lfence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据有序性写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前转载 2020-10-28 21:21:18 · 241 阅读 · 0 评论 -
多线程中sleep()与wait(),park()的区别
文章目录多线程中sleep()与wait()的区别Park & Unpark与与 Object 的 wait & notify 相比java中同步锁synchronized与Lock的区别使用 tryLock 解决哲学家就餐问题多线程中sleep()与wait()的区别sleep 是 Thread 方法,而 wait 是 Object 的方法sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用sleep 在睡眠的同时转载 2020-10-27 19:59:10 · 967 阅读 · 0 评论 -
java中线程的状态
Java中线程的状态操作系统层面来叙述(五种)java api层面来叙述(六种)操作系统层面来叙述(五种)【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行【运行状态】指获取了 CPU 时间片运行中的状态当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会原创 2020-10-27 19:20:02 · 353 阅读 · 0 评论 -
进程与线程
进程与线程的区别进程与线程1.进程2.线程二者的区别进程与线程1.进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)2.原创 2020-10-26 22:09:02 · 512 阅读 · 0 评论