摘要:
关于性能 性能的衡量标准有很多,如: 服务时间,等待时间用来衡量程序的"运行速度""多快"。 吞吐量,生产量用于衡量程序的"处理能力",能够完成"多少"工作。 多快和多少有时候是互相矛盾的。 关于可伸缩性 可伸缩性:当增加计算资源(CPU 内存 存储 带宽)时,程序的吞吐量或者处理能力能够相应的增加 阅读全文
2017年6月24日
摘要:
在使用Lock之前,我们都使用Object 的wait和notify实现同步的。举例来说,一个producer和consumer,consumer发现没有东西了,等待,producer生成东西了,唤醒。 线程consumer 线程producer synchronize(obj){ obj.wait 阅读全文
摘要:
线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行。或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException。 一般线程中的阻塞: A、线程执行了Thread. 阅读全文
2017年6月23日
摘要:
死锁 经典的死锁:哲学家进餐问题。5个哲学家 5个筷子 如果没有哲学家都占了一个筷子 互相等待筷子 陷入死锁 数据库设计系统中一般有死锁检测,通过在表示等待关系的有向图中搜索循环来实现。 JVM没有死锁检测。 锁顺序死锁 典型的列子:LeftRightDeadLock,多个线程尝试去获取左右的锁。这 阅读全文
摘要:
合理的控制线程池的大小: 下面内容来自网络。不过跟作者说的一致。不想自己敲了。留个记录。 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 任务的优先级:高、中、低。 任务的执行时间:长、中、短。 任务的依赖性:是 阅读全文
摘要:
ExecutorCompletionService CompletionService用来接收一个Executor的执行结果,将已经完成任务,放置在可使用 take 访问的队列上。 大概用法: Executor e = Executors. newCachedThreadPool(); Comple 阅读全文
摘要:
同步容器类 Vector和HashTable和Collections.synchronizedXXX 都是使用监视器模式实现的。 暂且不考虑性能问题,使用同步容器类要注意: 只能保证单个操作的同步。 这会引起两个问题: 第一个问题: 如果有一个功能,需要计算得到最后一个的值,有这个方法: list. 阅读全文
2017年6月20日
摘要:
这是在2013年的笔记整理。现在重新拿出来,放在网上,重新总结下。 package thread; /** * * @author zjf * @create_time 2013-12-18 * @use测试基本的两种线程的实现方式 * 测试中断 */ public class BasicThrea 阅读全文
摘要:
Java监视器模式 java监视器模式就是在将共享的数据封装在一个类里面,然后然后所有访问或者修改这些数据的方法都标注为synchronize。 车辆追踪模拟: 使用监视器模式: CarTracker对象维护了一个所有汽车坐标的Map,这个Map是竞争资源,线程会同时对它进行更新和读取。所以才每个方 阅读全文
摘要:
可见性 可见性是由于java对于多线程处理的内存模型导致的。这似乎是一种失败的设计,但是JVM却能充分的利用多核处理器的强大性能,例如在缺乏同步的情况下,Java内存模型允许编译器对操作顺序进行重排序,并将数值缓存在寄存器中,同时,它还允许CPU对操作顺序进行重排序,并将数值缓存在处理器的特定缓存中 阅读全文