java并发
diligence-zpf
厚积薄发
展开
-
java多线程相关知识点
1.sleep和wait的区别 (1).sleep是Thread中的静态方法,谁调用谁去睡觉,即使在T1线程里调用了T2线程的sleep方法, 实际上还是T1去睡觉。 (2)sleep方法不会释放对象得锁,而wait方法释放了锁. (3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。2.多线程练习(1)子线程循环...原创 2018-12-28 11:33:24 · 388 阅读 · 0 评论 -
java实现旅行预订门户搜索报价方案
**问题:**需要做这样一个旅行预订门户网站-----用户输入旅行的日期和其他需求,门户网站获取并显示来自多条航线,旅店或汽车租赁公司的报价。**分析:**在获取不同公司报价的过程中,可能会调用web服务,访问数据库,执行一个EDI事务或其他机制。在这种情况下,不易让页面的相应时间受限于最慢的时间响应,而应该只显示在指定时间内收到的信息。对于没有及时响应的服务提供者,页面可以忽略他们,或者显示一...原创 2019-01-09 17:17:20 · 418 阅读 · 0 评论 -
如何高效实现一个页面渲染器
一 java线程池的基础知识(磨刀不误砍柴工)1.newFixedThreadPool。newFixedThreadPool将创建一个固定长度的线程池,每当提交一个任务时创建一个线程,直到达到线程池的最大数量,这时线程池的规模将不再变化(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)。2.newCachedThreadPool。newCachedThr...原创 2019-01-09 14:43:03 · 323 阅读 · 0 评论 -
自定义一个Thread基类
场景:在应用程序中我们需要自己定义一个特殊的线程来调试,以区分其他的线程。比如说:为线程指定名字,设置自定义的UncaugthExceptionHandler向Logger中写入信息,维护一些统计信息(包括有多少线程被创建和销毁),以及在线程被创建和终止时把调试消息写入日志。代码如下:public class MyAppThread extends Thread{ public sta...原创 2019-01-13 17:46:11 · 592 阅读 · 0 评论 -
线程饥饿死锁
1.饥饿死锁介绍在线程池中,如果任务依赖于其他任务,那么可能产生死锁。在单线程Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会发生死锁。第二个任务停留在工作队列中,并等待第一个任务完成,而第一个任务又无法完成,因为它在等待第二个任务的完成。在更大的线程池中,如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,那么...原创 2019-01-13 16:29:03 · 341 阅读 · 0 评论 -
java并发实战第一部分小结
java并发编程实战第一部分总结笔记1.可变状态是至关重要的所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。2.尽量将域声明为final类型,除非需要他们是可变的。3.不可变对象一定是线程安全的。不可变对象能极大地降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无需使用加锁或保护性复制等机制4.封装有助于管理和复杂性在编写线程安全的...原创 2019-01-07 22:38:18 · 137 阅读 · 0 评论 -
shutdownNow的局限性以及解决办法
局限性:showdownNow会尝试取消正在执行的任务并返回所有已经提交但尚未开始执行的任务。也就是说我们不能了解到哪些任务已经开始但是尚未结束。解决办法如下:思路:判断任务在返回时是否处于中断状态。代码:public class TrackingExecutor extends AbstractExecutorService{ private final ExecutorServic...原创 2019-01-12 19:37:30 · 1195 阅读 · 0 评论 -
java实现日志服务
我们在服务器程序中经常用到日志,日志对于我们排查问题有很大的帮助。下面是日志服务的思路以及实现思路:多个生产者单个消费者的设计方式,每个调用log的操作都相当于一个生产者,而后台的日志线程则相当于消费者。public class LoggerService { private final BlockingQueue<String> queue; private final L...原创 2019-01-12 18:15:36 · 3876 阅读 · 0 评论 -
如何正确的终止线程
大多时候线程是运行直到结束或者让他们自己停止。然而有时候我们希望提前结束任务或线程,或许是因为用户取消的操作,或者应用程序需要被快速关闭。java中没有提供任何机制来安全地终止线程。但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。这种协作方式是必要的,我们很少希望某个任务,线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务和服务时...原创 2019-01-12 17:48:24 · 2529 阅读 · 0 评论 -
信号量
计数信号量用来控制同时访问某个特定资源的操作数量或者同时执行某个指定操作的数量。可以用来实现某种资源池(数据库连接池)或对容器施加边界。例如:使用Semaphore来为容器设置边界思路:将Semaphore的计数值为池的大小,并从池中获取一个资源之前先调用acquire方法获取一个许可,在将资源返回给池之后调用release释放许可,那么acquire将一直阻塞直到资源池不为空。publi...原创 2019-01-02 23:25:07 · 201 阅读 · 0 评论 -
学习如何构建一个高效且可伸缩的缓存
我们平时处理高并发的请求处理时,服务器的压力会很大。我们常做的就是构建一个高效的可伸缩的缓存来减轻服务器的压力。1.第一次尝试分析:使用 HashMap充当cache。public interface Computable&lt;A,V&gt; { V compute(A arg)throws InterruptedException;}public class Memoizer...原创 2019-01-07 10:20:03 · 186 阅读 · 0 评论 -
栅栏
1.栅栏与闭锁的区分相同点:栅栏类似与闭锁,都能阻塞一组线程直到某个事件的发生。不同点:闭锁是一次性对象,一旦终止就不能被重置,一般用于等待事件。栅栏是所有的线程必须都到达栅栏的位置,才能继续执行,一般用于等待其他线程,以及实现一些协议。比如:几个家庭决定在某个地方集合:“所有人6:00”在麦当劳集合,到了以后等待其他人,之后在讨论下一步要做的事情。2.CyclicBarrier的使用注...原创 2019-01-05 22:07:12 · 243 阅读 · 0 评论 -
java中的闭锁
/** * */package bi_suo;import java.util.concurrent.CountDownLatch;/** * @author zpf * @date 2018年12月28日 * 闭锁是一个同步工具类,可以延迟线程的进度直到其到达终点状态。 * 使用闭锁来测试n个线程并发执行某个任务时所需要的时间. */public class BiS...原创 2019-01-01 15:10:56 · 853 阅读 · 0 评论 -
java中常见的死锁以及解决方法
在java中我们常常使用加锁机制来确保线程安全,但是如果过度使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,但是这些被限制的行为可能会导致资源死锁。java应用程序无法从死锁中恢复过来,因此设计时一定要排序那些可能导致死锁出现的条件。1.一个最简单的死锁案例当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。在线程A持有锁L并想获得...原创 2019-01-15 23:17:10 · 33324 阅读 · 2 评论