随笔分类 -  java / Java并发

摘要:线程池的七大参数: (1)核心线程数。 (2)最大线程数。 (3)非核心线程存活时间。 (4)非核心线程存活时间的单位。 (5)阻塞队列。 (6)线程工厂。 (7)拒绝策略。 拒绝策略有四种: (1)由主线程执行这个任务。 (2)丢弃任务不报错。 (3)丢弃任务报错。(默认) (4)丢弃最先进来的任 阅读全文
posted @ 2023-05-28 23:29 程序员_YHB 阅读(32) 评论(0) 推荐(0) 编辑
摘要:死锁产生的条件:两个或者多个线程相互占用对方想要请求的资源,就会产生死锁。 死锁的四个必要条件: (1)互斥条件:同一时刻只有一个线程持有锁。 (2)请求与保持条件:一个线程因请求资源而阻塞,对已持有的资源保持不放。 (3)不可剥夺条件:线程在没有使用完自己持有的资源时,其它线程不能剥夺该线程的资源 阅读全文
posted @ 2023-05-28 22:39 程序员_YHB 阅读(17) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock和synchronized都是可重入锁。 ReentrantLock可以实现公平锁和非公平锁,默认非公平锁,而synchronized只能实现非公平锁。 ReentrantLock基于AQS实现,Synchronized基于JVM的monitor实现。 ReentrantL 阅读全文
posted @ 2023-05-28 22:18 程序员_YHB 阅读(17) 评论(0) 推荐(0) 编辑
摘要:AQS是一个实现阻塞式锁的框架,ReentrantLock锁就是基于AQS实现的阻塞式锁。 AQS的原理: (1)在AQS内部维护了一个用volatile修饰的state属性用来表示资源的状态,0表示无锁,1表示有锁。类似于monitor的owner属性。 (2)在AQS内部提供了一个FIFO的双向 阅读全文
posted @ 2023-05-28 22:09 程序员_YHB 阅读(52) 评论(0) 推荐(0) 编辑
摘要:volatile保证了线程之间的可见性。即某个线程修改了一个共享变量,这个变量立刻对所有线程可见。 volatile保证了指令重排序:用volatile修饰的共享变量在读、写时会加入一个内存屏障,保证了指令重排序。 volatile可以保证可见性、有序性,但是不能保证原子性。 阅读全文
posted @ 2023-05-28 21:57 程序员_YHB 阅读(3) 评论(0) 推荐(0) 编辑
摘要:CAS即比较并交换,是一种非阻塞式锁,也称为乐观锁,在无锁的情况下保证线程操作共享资源的原子性。 工作原理:采用CAS的方式修改共享资源时会读取共享资源作为一个预期值,在进行比较,如果预期值和当前值一样,那么就会更新成功,如果不一样,会采用自旋的方式再次获取共享资源的值尝试完成更新,当自旋次数达到一 阅读全文
posted @ 2023-05-28 21:50 程序员_YHB 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2023-05-28 21:35 程序员_YHB 阅读(16) 评论(0) 推荐(0) 编辑
摘要:JDK1.6时synchronized锁有: 偏向锁:在一段时间只有一个线程使用锁,此时就可以使用偏向锁,第一次获取到锁需要CAS操作,之后要再次获取锁,只需要在获取锁时判断当前线程id是否为已经获取锁的线程id,不需要CAS操作,提高了性能。 轻量级锁:多个线程交替持有锁,但是没有发生竞争,此时就 阅读全文
posted @ 2023-05-28 21:31 程序员_YHB 阅读(19) 评论(0) 推荐(0) 编辑
摘要:synchronized对象锁采用互斥的方式使得在同一时刻只有一个线程能够持有锁并操作共享资源,如果其它线程想要获取锁就会进入阻塞状态,从而保证了线程安全问题。 synchronized底层原理:synchronized的实现基于JVM的锁监视器(monitor),每个JVM都有维护自己的一套锁监视 阅读全文
posted @ 2023-05-28 21:16 程序员_YHB 阅读(53) 评论(0) 推荐(0) 编辑
摘要:(1)使用退出标志,让run()方法运行结束,线程正常停止。 (2)调用stop()方法强行终止线程,不建议使用该方法,容易产生死锁。 (3)使用interrupt方法中断线程。 阅读全文
posted @ 2023-05-28 16:36 程序员_YHB 阅读(65) 评论(0) 推荐(0) 编辑
摘要:(1)wait()方法是object类的方法,sleep是Thread类的静态方法。 (2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。 (3)线程调用wait()方法需要其它线程调用notify( 阅读全文
posted @ 2023-05-28 16:33 程序员_YHB 阅读(8) 评论(0) 推荐(0) 编辑
摘要:notify()方法随机唤醒一个处于等待的线程。 notifyAll()方法唤醒所有处于等待的线程。 阅读全文
posted @ 2023-05-28 16:29 程序员_YHB 阅读(15) 评论(0) 推荐(0) 编辑
摘要:在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在 一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 阅读全文
posted @ 2023-05-28 16:26 程序员_YHB 阅读(16) 评论(0) 推荐(0) 编辑
摘要:线程有六种状态: 新建:当线程被创建时,还没有调用start()方法。 可运行:调用start()方法后,等待CPU调度。 阻塞:线程没有获取到锁进入阻塞状态。 等待:线程获取到锁之后由于条件不满足调用wait()方法后释放锁进入等待状态,当其它持有锁的线程调用notify()或者notifyAll 阅读全文
posted @ 2023-05-28 16:22 程序员_YHB 阅读(34) 评论(0) 推荐(0) 编辑
摘要:创建线程有四种方式: (1)继承Thread类重写run()方法,调用start()方法启动线程。 (2)实现Runable接口,实现run()方法。 (3)实现Callable接口,实现call()方法。 (4)线程池创建线程。 为什么要使用线程池:减少线程的上下文切换带来的损耗、减少创建线程和销 阅读全文
posted @ 2023-05-28 16:10 程序员_YHB 阅读(65) 评论(0) 推荐(0) 编辑
摘要:并发:两个或多个线程轮流使用CPU资源。 并行:多个核同时调度线程执行任务,这个时候就是并行。 阅读全文
posted @ 2023-05-28 15:50 程序员_YHB 阅读(7) 评论(0) 推荐(0) 编辑
摘要:(1)进程是操作系统分配资源的基本单位。线程是CPU任务调度的基本单位。 (2)一个进程可以包含多个线程,进程内的线程共享进程内的资源。 (3)进程和进程之间的内存和资源相互隔离。 阅读全文
posted @ 2023-05-28 15:45 程序员_YHB 阅读(14) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示