并发编程
文章平均质量分 83
哈哈哈张大侠
不积跬步无以至千里
展开
-
并发编程(十五):并发容器
Java 提供的同步容器还有 Vector、Stack 和 Hashtable,这三个容器不是基于包装类实现的,但同样是基于 synchronized 实现的,对这三个容器的遍历,同样要加锁保证互斥。其采取的机制其实就是写时复制(CopyOnWrite)机制,读操作的时候不进行处理,写操作的时候复制数组并在复制的数组执行写操作,最后将数据的引用指向新的数组。但是针对包装后的容器采用迭代器遍历,还是会存在原子性的问题,因此这种场景也可以进行synchronized进行包装。原创 2023-04-27 23:22:56 · 229 阅读 · 1 评论 -
并发编程(十三):StampedLock
上述代码块如果在乐观读期间,存在写操作导致validate(stamp)无效,此时可升级为悲观读锁,否则此时只能无限循环validate操作或者直接return,是毫无意义的。关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(读多写少的场景中,JDK1.8提供了更快的解决方案,叫做StampeLock,其性能比ReadWriteLock要好。原创 2023-04-27 23:21:58 · 193 阅读 · 0 评论 -
并发编程(十二):ReadWriteLock
那 Java SDK 并发包里为什么还有很多其他的工具类呢?操作,其实就是相当于MySQL的写锁,只允许当前线程(事务)上进行读写操作(上读锁和写锁),其余线程如果请求上写锁或读锁时,就会发送阻塞操作直至取得写锁的线程释放写锁。操作,其实就是相当于MySQL的读锁,只允许当前线程和其他线程上读锁,但是不允许上写锁,此时如果当前线程上了读锁又去上写锁(锁升级),就会出现死锁的场景。锁降级:如果当前线程拿到了写锁,此时如果再去上读锁(降级为读锁),这个过程称为锁降级,ReadWriteLock是支持的。原创 2023-04-27 23:21:53 · 207 阅读 · 0 评论 -
并发编程(十一):Semaphore
关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(互斥锁只是Semaphore的一个功能,其有一个功能是Lock无法轻易实现的,就是Semophore可以允许多个线程访问一个临界区,这也是计数器的作用所在。信号量模型里面,down()、up() 这两个操作历史上最早称为 P 操作和 V 操作,所以信号量模型也被称为 PV 原语。其中限制临界区访问线程数,我们可以应用于如下场景。原创 2023-04-27 23:20:57 · 118 阅读 · 0 评论 -
并发编程(十):Lock和Condition
死锁问题中,对于死锁条件之一不可抢占条件(其他线程无法抢占线程已占用的资源),synchronized是无法处理的,因为其申请资源时,如果申请不到就直接进入了阻塞状态,而线程一旦进入阻塞状态,除非该线程主动调用notify方法,不然其他线程啥都干不了。这一条件,如果没有满足则调用wait等待,在满足条件时再去通知,这样,RPC调用的TCP层面中,线程是不会等待响应结果的异步流程变为了需要等待结果的同步流程,这也是我们之前所讲述的。非公平锁:不提供这个公平保证,有可能等待时间短的线程反而先被唤醒。原创 2023-04-27 23:20:27 · 199 阅读 · 0 评论 -
并发编程(九):如何写好并发程序
关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(封装共享变量其实指的就是将共享变量封装在内部,只暴露几个公共的方法允许外部访问该共享变量,写代码时在针对这些访问路径进行严格的控制访问。原创 2023-04-27 23:19:57 · 69 阅读 · 0 评论 -
并发编程(八):创建多少线程合适
其实建议在开发中不必去拘泥于具体的线程数,线程池的配置可以先按照经验配置一个,随时关注线程池大小对程序的影响:可以为你的程序配置一个全局的线程池,需要异步执行的任务,扔到这个全局线程池处理,线程池大小按照经验设置,每隔一段时间打印一下线程池的利用率。IO密集型的场景我们需要考虑CPU计算耗时和IO操作耗时的比率,例如CPU 计算和 I/O 操作的耗时是 1:2,那多少个线程合适呢?如果程序只有 CPU 计算,而没有 I/O 操作的话,多线程不但不会提升性能,还会使性能变得更差,原因是增加了线程切换的成本。原创 2023-04-27 23:19:50 · 244 阅读 · 0 评论 -
并发编程(七):线程的生命周期
线程处于RUNNABLE状态时,并且阻塞在 java.nio.channels.InterruptibleChannel 上时,如果其他线程调用线程 A 的 interrupt() 方法,线程 A 会触发 java.nio.channels.ClosedByInterruptException 这个异常;这个异常的触发条件就是:其他线程调用了该线程的 interrupt() 方法。而我们平时所谓的 Java 在调用阻塞式 API 时,线程会阻塞,指的是操作系统线程的状态,并不是 Java 线程的状态。原创 2023-04-19 23:44:39 · 96 阅读 · 0 评论 -
并发编程(六):管程
就可以看作一个条件变量)不满足,此时线程T1就可以调用wait()方法,并进入条件变量的等待队列,然后线程T2进入了管程中或执行了一个操作,发现T1不满足的某个条件满足了,此时T2就可以调用notify()/notifyAll()通知条件变量等待队列中的某个线程或全部线程,此时T1再去重新去从入口进入管程执行方法。synchronized 关键字修饰的代码块,在编译阶段会自动生成相关加锁和解锁的代码,但是仅支持一个条件变量,所以使用synchronized实际上只体现了管程的互斥,而同步却无法提现。原创 2023-04-19 23:43:57 · 397 阅读 · 1 评论 -
并发编程(五):安全性、活跃性以及性能问题安全性、活跃性以及性能问题
概念:线程有时候并没有发生阻塞,但是仍然会执行不下去,这就是“活锁”,举例来说就是线程A、B同时申请资源时候,发现对方也在申请资源,然后两者开始互相谦让资源导致一直等待的问题。方法1和3场景比较有限,方法2的解决方案主要是公平锁,所谓公平锁,是一种先来后到的方案,线程的等待是有顺序的,排在等待队列前面的线程会优先获得资源。(1-p):串行百分比,作临界区都是串行的,非临界区都是并行的,用单线程执行临界区的时间/用单线程执行(临界区+非临界区)的时间就是串行百分比。:程序的正确性依赖于线程执行的顺序。原创 2023-04-19 23:43:26 · 86 阅读 · 0 评论 -
并发编程(四):如何应对死锁
而且 wait()、notify()、notifyAll() 这三个方法能够被调用的前提是已经获取了相应的互斥锁,所以我们会发现 wait()、notify()、notifyAll() 都是在 synchronized{}内部被调用的。而且 wait()、notify()、notifyAll() 这三个方法能够被调用的前提是已经获取了相应的互斥锁,所以我们会发现 wait()、notify()、notifyAll() 都是在 synchronized{}内部被调用的。原创 2023-04-19 23:43:04 · 201 阅读 · 0 评论 -
并发编程(三)互斥锁:解决原子性问题
简单来说,关联关系就是一种原子性特征:外在表现是不可分割,本质操作的。原创 2023-04-19 23:42:19 · 69 阅读 · 0 评论 -
并发编程(二)Java内存模型:解决可见性、有序性问题
关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(导致可见性的原因是CPU缓存、导致有序性的原因是编译器优化,那么按需禁用缓存和编译优化就有了一定的必要,但是该如何按需禁用呢?站在程序员的视角,本质上可以理解为,Java内存模型提供了禁用缓存和编译器优化的方法和规范。对于程序员而言,如何做到按需禁用呢?也就说前面对共享变量进行操作,后面操作针对该共享变量是可见的。原创 2023-04-19 23:41:48 · 52 阅读 · 0 评论 -
并发编程(一)并发编程bug的源头:可见性、有序性、原子性
上述所说的CPU缓存、CPU的线程切换、编译器的重排序等和我们写并发程序的目的一致,都是为了提高程序性能,合理利用系统资源。原创 2023-04-19 23:41:20 · 79 阅读 · 0 评论 -
并发编程:并发编程的核心问题
通俗来说,就是现实当中需要完成一个项目,项目经理需要将任务分配给不同的人员完成,Java SDK并发包中的Executor、Fork/Join、Future本质都是一种分工方法,再例如生产者-消费者模式,也是一直分工方法,映射到现实生活中就是餐厅的大厨和服务员,大厨负责炒菜并将菜放到窗口,服务员复制从窗口拿菜,如果不使用窗口,而采取大厨直接将菜递给服务员,那么大厨就需要等待服务员,从而效率降低,因此我们能够看出第一种分工模式明显好于第二种,由此我们也能明白分工的含义,就是高效的拆解任务并进行分配。原创 2023-04-11 23:05:16 · 79 阅读 · 0 评论