随笔分类 -  并发编程

摘要:什么是线程死锁,如何解决 ? 产生死锁的条件有四个: 互斥条件:所谓互斥就是进程在某一时间内独占资源。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 线 阅读全文
posted @ 2021-04-15 10:50 杨岂 阅读(424) 评论(0) 推荐(0) 编辑
摘要:JDK 1.6对synchronized进行了大量优化,使其不那么重了。如为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。 Java中的每一个对象都可以作为锁,有以下三种形式: (1):对于普通方法,锁是当前实例对象 (2):对于静态同步方法,锁是当前类的Class对象 (3):对于同 阅读全文
posted @ 2021-04-10 11:07 杨岂 阅读(106) 评论(0) 推荐(0) 编辑
摘要:FutureTask是Callable的核心实现 多线程的实现方式: 1、继承Thread类 2、实现Runnable接口 3、实现Callable<V> 接口 通过实现Callable接口来创建多线程,在执行完成后可获取执行结果。 Callable接口: 对于需要执行的任务需要实现Callable 阅读全文
posted @ 2021-03-21 22:30 杨岂 阅读(44) 评论(0) 推荐(0) 编辑
摘要:一、实现生产者消费者(线程交替执行) Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll() condition.await()方 阅读全文
posted @ 2021-01-16 23:47 杨岂 阅读(625) 评论(0) 推荐(0) 编辑
摘要:一、自旋锁和自适应自旋锁 自旋锁: 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要操作系统切换CPU从用户态转到核心态中去完成。这些操作给操作系统的并发性能带来了很大的压力。 如果同步代码块中的内容过于简单,状态切换消耗的时间有可能比用户代码执行的时间还要长。 在许多场景中,共 阅读全文
posted @ 2020-03-23 18:22 杨岂 阅读(260) 评论(0) 推荐(0) 编辑
摘要:项目描述:定时任务扫描300万条数据库记录,并对每条记录执行检查操作(调用其他服务接口,发送短信等)。 版本迭代记录: 1)第一版:一次查询全部300万条数据放在JVM内存中,没有使用线程池,使用固定20个线程,每个线程循环不停的从内存中取一条数据执行,直到所有数据全部执行完为止。 这种方式耗时大约 阅读全文
posted @ 2020-03-17 09:57 杨岂 阅读(248) 评论(0) 推荐(0) 编辑
摘要:乐观锁和悲观锁是两种思想,并不局限于编程语言或数据库。 一、概念 乐观锁: 乐观锁在操作数据时持乐观态度,认为别的线程不会同时修改数据。因此乐观锁不会加锁,只有在执行更新的时候判断一下在此期间其他线程是否修改了数据;如果其他线程修改了数据则放弃操作,否则执行操作。 悲观锁: 悲观锁在操作数据时持悲观 阅读全文
posted @ 2020-03-16 18:51 杨岂 阅读(178) 评论(0) 推荐(0) 编辑
摘要:一、线程池 线程池适合处理的任务:执行时间短、工作内容较为单一。 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可以不用等待线程创建就能立即执行 3)提高线程的可管理性:可以统一对线程进行分配、调优和监控 4)提供 阅读全文
posted @ 2020-03-05 21:46 杨岂 阅读(613) 评论(0) 推荐(0) 编辑
摘要:并发编程的目的是为了充分利用资源让程度运行的更快,原则是,将代码中串行执行的部分变成并发执行。 并发:指多线程交替执行 / 并行:指同时执行 1、多线程面临的挑战 并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在使用多线程时需面临以下的几个挑战: 1) 阅读全文
posted @ 2020-03-03 15:27 杨岂 编辑
摘要:前言 进程:进程是操作系统资源分配的最小单位 进程有自己的虚拟地址空间,这个空间包括了各种资源,例如堆、栈,各种段,它们其实都是虚拟地址空间的一块区域。所以说进程是资源分配的最小单位。 线程:线程是操作系统任务调度和执行的最小单位。 线程包含在进程之中,是进程中实际运作单位 协程:协程运行在线程之上 阅读全文
posted @ 2019-06-14 18:00 杨岂 阅读(3410) 评论(0) 推荐(1) 编辑
摘要:Lock Lock是顶层接口,它的实现逻辑并未用到synchronized,而是利用了volatile的可见性。 public interface Lock { /** * Acquires the lock.获取锁 * 如果锁不可用,则当前线程将被禁用以用于线程调度,并处于休眠状态,直到获得锁为止 阅读全文
posted @ 2019-06-13 23:31 杨岂 阅读(714) 评论(0) 推荐(0) 编辑
摘要:Lock与Synchronized: 1、Synchronized无法判断是否获取锁的状态,Lock可以判断是否获取锁2、Lock中的某些锁允许对共享资源的并发访问,如ReadWriteLock读写锁,readLock()获取读锁,writeLock()获取写锁,读锁可以被多个线程获取,写锁只能有一 阅读全文
posted @ 2019-04-11 18:27 杨岂 阅读(149) 评论(0) 推荐(0) 编辑
摘要:concurrent包下的类都有下面的实现模式1、首先,声明变量为volatile2、然后,使用CAS的原子条件更新来实现线程之间的同步3、配合使用volatile的写可见性和CAS的原子性来实现线程之间的通信(线程安全) 最近在看 java.util.concurrent.atomic 包下的At 阅读全文
posted @ 2019-04-04 11:59 杨岂 阅读(224) 评论(0) 推荐(0) 编辑
摘要:创建线程池不允许使用Executors去创建,而是使用ThreadPoolExecutor的方式,通过使用ThreadPoolExecutor的方式我们可以根据业务需要指定适合的核心线程数最大线程数,线程空闲存活时间,任务等待队列,拒绝策略,还可以指定线程名称等。 Executors创建线程池的方式 阅读全文
posted @ 2019-04-03 20:01 杨岂 阅读(239) 评论(0) 推荐(0) 编辑
摘要:可重入锁,持有锁的线程可以进入任何锁所同步的代码块 不可重入锁: public class Lock { private boolean isLock = false; /** * 同步方法 */ public synchronized void lock() throws InterruptedE 阅读全文
posted @ 2019-03-28 14:52 杨岂 阅读(265) 评论(0) 推荐(0) 编辑
摘要:Synchronized(实例锁)和 static Synchronized(类锁)区别 实例锁:锁在某个对象上,如果该类是单例的,那么该锁也有全局锁的概念 类锁:该锁针对的类,无论实例多少个对象,那么线程都共享该锁。 Java的锁分为对象锁和类锁。 1. 当两个并发线程访问同一个对象object中 阅读全文
posted @ 2017-09-13 21:18 杨岂 阅读(511) 评论(0) 推荐(0) 编辑

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