Java并发编程实战笔记
文章平均质量分 78
kingdz618
一只想要成为攻城狮的程序猿
展开
-
【Java并发】JAVA并发编程实战-读书笔记2
当多个线程访问同一个类时,如果不考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。一个无状态的Servletpublic void service(ServlerRequest req,ServletResponse resp){ BigInteger i=extractFromRequ原创 2016-10-12 21:02:38 · 423 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记18
在激烈竞争的情况下,闯入锁比公平锁性能好的原因之一是:挂起的线程重新开始,与他真正开始运行,两者之间会产生严重的延迟。我们假设线程A持有一个锁,线程B请求该锁。因为此时锁正在使用中,所以B会被挂起。当A释放锁后,B重新开始。与此同时,如果C请求这个锁,那么C得到了很好的机会获得这个锁使用它,并且甚至可能在B被唤醒前就已经释放该锁了。在这样的情况下,各方面都获得了成功,B并没有比其他任何线程晚得到锁原创 2016-11-28 21:14:50 · 674 阅读 · 2 评论 -
【Java并发】JAVA并发编程实战-读书笔记17
ConcurrentHashMap的实现使用了一个包含16个锁的Array,每一个锁都守护Hash Bucket的1/16,Bucket N由第N mod 16个锁来守护。public class StripedMap{ //同步策略:buckets[n]由lock[n%N_LOCKS]保护 private static final int N_LOCKS=16; p原创 2016-11-17 21:01:30 · 393 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记16
Java应用程序不能从死锁中恢复,所以确保你的设计能够避免死锁出现的先决条件是非常有价值的。public class LeftRightDeadLock(){ private final Object left=new Object(); private final Object right=new Object(); public void leftRight(){原创 2016-11-03 21:03:50 · 331 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记4
无论是什么原因保证线程安全的实际要求,都只是存在于一线开发人员编码的那一刻。如果线程内部用法的设定没有清楚地文档化,那么后期维护人员会错误放任对象的逸出。一种维护线程限制的更加规范的方式是使用ThreadLocal,他允许你将每个线程与持有数值的对象关联在一起。ThreadLocal提供了set和get访问器,get总是返回由当前执行线程通过set设置的最新值。private static原创 2016-10-17 21:02:17 · 480 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记5
设计线程安全类的过程应该包括下面3个基本要素 1,确定对象状态是由哪些变量构成的 2,确定限制状态变量的不变约束 3,制定一个管理并发访问对象状态的策略将数据封装在对象内部,把对数据的访问限制在对象的方法上,更易确保线程在访问数据时总能获得正确的锁。public class PersonSer{ private final Set mySer=new HashSet原创 2016-10-19 10:38:34 · 411 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记6
为类的用户编写线程安全性担保的文档;为类的维护者编写类的同步策略文档。java.text.SimpleDateFormat并不是线程安全的,如果一个类没有明确指明,就不要假设他是线程安全的。另一方面,倘若不对容器提供的对象(比如HttpSession)的线程安全性做出一些合理的假设,又不可能开发一个基于Servlet的应用。在设计同步容器返回的迭代器时,并没有考虑到并发修改的问题,当他们察原创 2016-10-20 21:06:36 · 401 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记7
对于InterruptedException应该传递或者恢复中断,建议不要捕获他但是不做任何处理,这样做会丢失线程中断的数据,从而剥夺了上层栈的代码处理终端的机会。只有一种情况允许掩盖中断,那就是你扩展了Thread并因此控制了所有处于调用栈上层的代码。原创 2016-10-21 19:50:37 · 494 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记8
为计算结果建立高效、可伸缩的高速缓存原创 2016-10-24 21:32:33 · 424 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记19
AbstractQueuedSynchronizer简称AQSAQS中获取或释放操作的规范式boolean acquire()throws InterruptedException{ while(state does not permit acquire){ if(blocking acquisition requested){ enqueue current原创 2016-11-29 21:15:40 · 438 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记20
假设一个线程为变量a赋值:a=3;存储模型要回答这个问题:“在什么条件下,读取a的线程会看到3这个值?”编译器生成指令的次序,可以不同于源代码所暗示的显然的版本,而且编译器还会把变量存储在寄存器而不是内存中;处理器可以乱序或者并行地执行指令;缓存会改变写入提交到主内存的变量的次序;最后,存储在处理器本地缓存中的值对于其他处理器并不可见。这些因素都会妨碍一个线程看到一个变量的最新值,而且原创 2016-11-30 21:14:33 · 378 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记3
发布一个对象的意思是使它能够被当前范围之外的代码所使用。比如将一个引用存储到其他代码可以访问的地方,在一个非私有的方法中返回这个引用。在很多情况下,我们需要确保对象及它们的内部状态不被暴露。一个对象在尚未准备好时就将它发布,称作逸出。最常见的发布对象的方式就是将对象的引用存储到公共静态域中,任何类和线程都能看到这个域。public static Set knownSecrets;publ原创 2016-10-13 22:00:43 · 415 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记9
并发并用程序是围绕任务进行管理的。所以设计时要指明一个清晰的任务边界。理想情况下,任务时独立的。在正常负载下,服务器应用程序应该兼具良好的吞吐量和快速的响应性。应用程序在负荷过载时平缓地劣化,而不能负载一高就简单地以失败告终。所以要清晰任务边界并配合一个明确的任务执行策略。大多数服务器选择了下面这个自然的任务边界:单独的用户请求。class SingleThreadWebServer{原创 2016-10-25 21:44:06 · 284 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记10
如果你想Executor提交了一个批处理任务,希望获得结果,只能不断的调用timeout为零的get。幸运的是有一种更好的方法:完成服务(completion service)CompletionServie整合了Executor和BlockingQueue的功能。可以将Callable的任务提交给它去执行,然后使用类似队列中的take和poll方法,在结果完整可用时获得这个结果。Exec原创 2016-10-26 21:15:22 · 292 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记11
除非你知道线程的中断策略,否则你不应该中断线程。任务执行线程由标准的Executor实现创建,他实现了一个中断策略使得任务可以通过中断被取消,所以当他们在标准Executor中运行时通过他们的Future来取消任务,可以设置cancel的参数值为true。当尝试取消一个任务的时候,你不应该直接中断线程池,因为你不知道中断请求到达时什么任务正在运行——只能通过任务的Future来做这件事情。原创 2016-10-27 20:52:47 · 369 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记12
ExecutorService提供了两种关闭的方法:使用shutdown优雅的关闭、使用shutdownNow强行的关闭。在强行关闭中,shutdonwNow首先尝试关闭当前正在执行的任务,然后返回待完成任务的清单。两种不同的终结选择在安全性和响应性之间进行了权衡:强行终结的速度更快,但是风险大,因为任务很可能在执行到一半的时候被终结,而正常终结虽然速度慢,却安全,因为直到队列中的所有任务原创 2016-10-28 21:26:32 · 351 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记13
JVM既可以通过正常手段关闭,也可以强行关闭。当最后一个“正常(非守护)”线程终结时或者有人调用了System.exit时以及铜鼓哦使用其他与平台相关手段时(比如发送了SIGINT或键入Ctrl-C),都可以开始一个正常的关闭。尽管JVM可以通过这些标准的首选方法关闭,他仍然能够通过调用Runtime.halt或者杀死JVM的操作系统进程被强行关闭(比如发送SIGKILL)。在正常的关闭中,J原创 2016-10-31 21:14:39 · 335 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记14
无论何时,线程池需要创建一个线程都要通过一个线程工厂。public interface ThreadFactory{ Thread newThread(Runnable r);}默认的线程工厂创建一个新的非守护的线程,其中的newThread会在创建一个新线程时被调用。public class MyThreadFactory implements ThreadFactor原创 2016-11-01 21:21:57 · 397 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记15
如果使用Executor实现SwingUtilitiespublic class SwingUtilities{ private static final ExecutorService exec= Executors.newSingleThreadExecutor(new SwingThreadFactory()); private static volatile Thre原创 2016-11-02 21:01:52 · 389 阅读 · 0 评论 -
【Java并发】JAVA并发编程实战-读书笔记1
从今天开始阅读《JAVA并发编程实战》这本书,并记录下自己阅读的记录。 首先感谢该书的原作者,几个外国的大神,也感谢韩锴、方妙两位译者。 程序在各自的进程中运行,相互分离,各自独立执行。由操作系统分配空间。 进程会通过一些原始的机制相互通信:Socket、信号处理、共享内存、信号量和文件。 线程有时被称为轻量级的进程。 同一个进程中的线原创 2016-10-11 21:14:17 · 467 阅读 · 0 评论