java并发编程 学习笔记

记一下学习过程的觉得需要注意的点吧

第二章、线程安全性

无状态对象一定是线程安全的
内置锁是可重入的,就是说获得锁的操作的粒度是一个『线程』,而不是一个『调用』。
synchronized 函数,是对类的实例加锁。

第三章、对象的共享

在程序中,可能编译过程中会进行重排序。就是对代码中的执行顺序可能进行改变,这样的优势是充分利用流水线的作用。 (这个有点可怕呀)

volatile
关键字可以保证变量的可见性,因为对volatile
的操作都在Main Memory中,而Main Memory是被所有线程所共享的,这里的代价就是牺牲了性能,无法利用寄存器或Cache。volatile
还有一个作用就是局部阻止重排序的发生

对于非volatile类型的64位数值变量double和long
jvm允许将64位的读操作和写操作分解成两个32位的操作,所以不考虑失效数据的问题,在多线程中共享
可变的long和double也是不安全的,除非用volatile来声明他们。(这个也要注意下,可能webApi中,会修改一个全局变量,这个时候long的修改可能会读到一个错误的值)

在构造函数中最好不要新建一个线程并启动,可以吧启动放在后续的函数中。因为可能在构造完成之前,线程就会访问到this的值。

线程封闭

  • ad-hoc线程封闭
    这个好像说完全自己在代码里注意
  • 栈封闭
    相当于用局部变量
  • Threadlocal类
    不同线程调用的一个Threadlocal变量不一样
第四章、对象的组合

没啥,主要注意加锁的时候,要加在一个锁上面,不要加错了

第五章、基础构建模块

Hashtable和Vector是同步容器
创建一个同步List Collections.synchronizedList(new ArrayList<Object>());

通过并发容器来代替同步容器,可以极大的提高伸缩性并降低风险
接下来介绍了一些并发容器:

  • cuncurrentHashMap 使用的是分段锁,实现了额外的原子操作,类似相等则移除之类的,保障他的迭代器不会影响。
  • copyOnWriteArrayList 每次修改的时候都会把底层数组复制一遍,这样保障他的迭代器不会影响。
  • LinkBlockList ArrayBlockList.是FIFO队列
  • PriorityBlockingQueue 是一个优先级的队列
  • 双端队列 Deque ,可以实现,生产者首先读取自己的队列,空了再去别人的队列尾部开始工作,降低了队列的竞争程度

中断
首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。
中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。
因此,如果线程Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。Listing C这个示例描述了该技术。
http://www.cnblogs.com/simonshi/archive/2011/12/31/2308455.html 这个讲的还可以

同步工具类

  • CountDownLatch是一种灵活的闭锁实现,await会一直阻塞到,值为0.countDown会把值减1(闭锁,门一开始是关闭的,等待所需要的资源都初始化之后,会打开,并且一直打开)
  • FutureTask,Callable。一种有结果的Runnable.future.get() 可以获得
  • 信号量Semaphore
  • CyclicBarrier 感觉和countDownLatch差不多,只是可以重复使用
第六章、任务执行

Executor 任务执行框架
如果在程序中实现一个生产者消费者的设计,那么最简单的方式就是使用Executor

延时任务和周期性任务
Timer类和ScheduledThreadPoolExecutor。
Timer有一些缺陷,Timer在执行任务时只会创建一个线程,如果某个任务执行时间过长,将会影响其他的TimerTask的精确性。而且如果TimerTask抛出了一个未检查的异常,那么Timer将变现出糟糕的行为。
在java 5.0或更高的jdk中,将很少使用Timer。

如果要构建自己的调度系统,可以使用DelayQueue。(可以设置过期时间,然后take的时候,只能取出到了时间的)

可以用ExecutorService的submit(callable a)方法来得到一个Future,然后future.get()得到返回值。但是这里所有的都会在future.get()处等待
可以使用ExecutorCompletionService来进行处理,在提交多个task之后,起一个轮训,取completion.take(),这样可以获取完成了的线程。

为任务设置时限:
1.可以使用future.get(long timeout, TimeUnit unit),然后catch住TimeOutException

对于要对多个futureTask设定实现,可以使用invokeAll(List<Callable> **, long timeOut, TimeUtil unit)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,766评论 1 19
  • 线程池 策略 当线程数量未达到核心线程数量,直接启动一个核心线程来执行任务。 如果线程数量已达到或者超过核心线程的...
    liaowenhao阅读 456评论 0 1
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 811评论 0 3
  • 现在没工作,每天做着白日梦,梦着自己突发大财,买了套房子,养了一堆动物,掐指一算,我此生多半是废了
    眼泪_阅读 269评论 0 0
  • 文/小贱 1 时间过得真快,这两眼一闭双腿一蹬就到了周一,又到悲催的上班时间了!生活不易,好好加油吧! 不过令人高...
    贱公子阅读 918评论 0 1