
并发编程
文章平均质量分 69
zero _s
这个作者很懒,什么都没留下…
展开
-
并发编程-----线程池
线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。风险与机遇用线程池构建的应用程序容易遭受任何其它多线程应用程序容易遭受的所有并发风险,诸如同...原创 2021-08-08 09:41:23 · 102 阅读 · 0 评论 -
并发编程----并发工具类
这些并发过程中使用的工具类较为重要,实际工作中使用比价频繁。CountDownLatch:await(),进入等待的状态;countDown(),计数器减一,等待中的线程会恢复;应用场景:启动三个线程计算,需要对结果进行累加。public class countdownLatchDemo { public static void main(String[] args) { CountDownLatch count...原创 2021-08-07 16:10:57 · 132 阅读 · 0 评论 -
并发编程---原子类
对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后, 新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式, 这些类同样位于JUC包下的atomic包下,发展到JDk1.8,该包下共有17个类, 囊括了原子更新基本类型、原子更新数组、原子更新属性、原子更新引用。原子类,不需要加同步资源锁/** * 原子类 */public class Demo1 { private static AtomicInteger sum = new A原创 2021-08-07 14:42:28 · 237 阅读 · 0 评论 -
并发编程----线程间的通信
何时使用线程间通信: 有时候一个线程的执行,依赖于另外一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAll wait跟sleep的区别 wait会释放持有的锁,而sleep不会,sleep只是让线程在指定的时间内,不去抢占cpu的资源 注意点 wait notify必须放在同步代码块中, 且必须拥有当前对象的锁,即不能取得对象的锁,而调用B对象的wait 哪个对象wait,就得调哪个对象的notify。生产者-------(中间商)...原创 2021-08-06 22:45:07 · 93 阅读 · 0 评论 -
并发编程---锁
1、锁的分类自旋锁: 线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁上下文切换不值得。jvm实现,使线程在没获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起阻塞锁:阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进入运行状态重入锁:支持线程再次进入的锁,就跟我们有房间钥匙,可以多次进入房间类似读写锁: 两把锁,读锁跟写锁,写写互斥、读写互原创 2021-08-06 17:59:37 · 226 阅读 · 0 评论 -
并发编程--创建线程的几种方法
1、继承thread类public class Mythread extends Thread{ @Override public void run(){ // 这里写入 task code; System.out.println(Thread.currentThread().getName()); } /** * 创建线程的第一种方法,继承thread,然后重写它的run方法 * @param args原创 2021-08-05 09:24:27 · 146 阅读 · 0 评论 -
并发编程01--线程安全性
当多个线程访问某个类,不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。----《并发编程实战》什么是线程不安全? 多线程并发访问时,得不到正确的结果。javac -c demo.class 可以进行反编译javac demo 编译 产生线程不安全问题的原因: num++ 不是原子性操作,被拆分成好几个步骤,在多线程并发执行的情况下,因为cpu调...原创 2021-08-04 22:09:42 · 138 阅读 · 0 评论