和阿里大拿一起聊聊Java并发那些事儿
获奖详情:http://bbs.chinaunix.net/thread-4189660-1-1.html话题背景:
现在Java和微软的.Net两大平台对垒,各有所长,长时间内会持续共存。虽然Java运行速度慢,但其跨平台特性使得围绕着JVM语言依然一片生机。现在计算机速度越来越快,JVM的设计本身也不断借鉴其它语言使得其速度与早期有大大提高。现在并发编程越来越重要,Java相比其它语言,在语言层次对并发编程的提供了更加友好的支持,这就大大减轻了并发编程过中的设计成分,这也为Java语言提供了 更强的竞争力。在你工作过程中,结合实际,讨论以下问题:
讨论话题:
1:在你工作中是否有并发编程经历?简述一下。
2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式.
3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求.
4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
讨论时间:
2015年8月17日—2015年9月15日
活动奖励:
活动结束后将选取5名讨论精彩的童鞋,每人赠送一本《Java并发编程的艺术》作为奖励。
奖品简介:
http://images.china-pub.com/ebook4730001-4735000/4730532/zcover.jpg
作者:方腾飞、魏鹏程、晓明
丛书名:Java核心技术系列
出版社:机械工业出版社
ISBN:9787111508243
上架时间:2015-7-14
出版日期:2015 年7月
开本:16开
版次:1-1
内容简介:
并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,本书是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和帅foQ等技术社区,得到了非常高的评价。它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。
内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介绍了如何应用这些技术。
试读样章:
人气很低,这是一本好书,大家快来参与。 本帖最后由 chenxing2 于 2015-08-20 16:00 编辑
1:在你工作中是否有并发编程经历?简述一下。
并发编程通常少不了线程,线程两种实现方式也是多线程的基础。
使用第三方推送时,使用生产者消费者模式,并限制推送量及时间。
用NETTY实现内部聊天系统,有时间使用这个做推送功能抛开第三方。
2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式.
并发编程,最开始是最大化利用单机资源。
并发编程的方式:
BIO,传统的并发编程方式,缺乏弹性,服务器端的线程与客户端连接数一致,线程数膨胀代理系统性能下降,
最后,栈溢出、线程创建失败、直到程序崩掉。现在很少用了。
NIO,JDK1.4引入,1.7带来了NIO2.0,目前主流方式,代表框架mina/netty。基于事件驱动方式解决BIO的
大并发问题。
AIO,JDK1.7引入的,目前不是主流。性能貌似不如NIO,但适合大文件的编写。
从AIO的发展来看,从03年的Linux Kernel 2.4到IBM再到ORACLE 07年Oracle尝试用
syslet方案实现新的AIO,也没有了下文,目前这个AIO还待观察。
也有基于Actor模型的并发编程方式,如AKKA
基于ringbuffer模型的Disruptor等等
3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求.
在多核系统中,处理器一般有一层或者多层的缓存,这些的缓存通过加速数据访问和降低共享内存在总线
上的通讯来提高CPU性能,并发编程对语言层次的要求,首先要充分利用这个缓存来大大的提高性能;其次要
能正确的使用缓存中的值,因为需要保证多个线程任何时候访问某个内存地址时,要能看到完全相同的值。
对于C/C++等语言则没有内存模型,他们对于发生在编译器和处理器平台架构的重排序行为的保护机制依赖于
程序中所使用的线程库、编译器、以及代码所运行的平台提供的保障。
对于java等存在内存模型的语言来说
在弱内存模型下,通常需要使用内存屏障(CPU指令)来处理缓存->使缓存无效,就为了让处理器看到缓存
最新的值,如volatile关键字
在强内存模型下,就减少了对内存屏障的依赖,性能也会提高,毕竟内存屏障通常在锁模式下完成。
目前来看更偏向于弱内存模型,因为该模型在多处理器平台或更大内存下可以实现更好的可伸缩性。
4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
这个个人能力达不到,还是使用成熟框架吧,如NETTY、AKKA之类的。
5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
目前来看并发编程,难度比较高,很容易出现各种各样的问题。
下一代的编程方式,应该易用,而又不失并发的性能。
shenlanyouyu总是这么给力:em02: 回复 2# shenlanyouyu
本帖最后由 jieforest 于 2015-08-19 16:03 编辑
1:在你工作中是否有并发编程经历?简述一下。
这是常事了,这么多年来,时不时就会写一些多线程的开发。我在这方面的历程大致是这样的:
最早是直接用Java线程类(或继承Runnable)实现多线程程序,以达到并发的效果。
接着是自己实现了线程池,减少线程的创建及销毁的开销,对线程提供了基本的管理,实现了线程的复用。
再后来是利用Java 7引入的Fork/Join框架开发。
再后来是使用Akka库开发高并发、高性能的程序。
目前也在尝试逐步使用GoLang开发一些高并发的程序。
2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式。
请参考第一问的答案。
3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求。
Java线程间的通信有两类:一是共享内存的方式;二是消息传递的方式。
Java线程间的通信是由Java内存模型所控制的,它决定了一线程的共享变量是否对另一线程可见。
每个线程都有自己的本地内存,本地内存存储了读写共享变量的副本,而共享变量存放于主内存中。
缓冲区技术得到广泛应用,处理器会使用写缓冲区临时保存向内存写入的数据,写缓冲区可以保证指令流水线持续运行,避免延迟,并减少内存总线的占用。但是处理器的写缓冲区仅对它所在的处理器可见,会导致处理器执行内存操作的顺序可能会与内存实际的操作执行顺序不一致。因此目前的多核处理器允许对写-读操作进行重排序。
为了保证内存可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。
Java的内存屏障类型有:LoadLoad Barriers、StoreStore Barriers、LoadStore Barriers、StoreLoad Barriers。
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。无论怎样重排序,编译器、运行时和处理器都必须遵守as-if-serial语义。
在设计时,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。顺序一致性内存模型是一个理想的理论参考模型,它为程序员提供了极强的内存可见性保证。
4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
没明白LZ的意图。说的是语言内部的并发实现方式呢?还是说业务应用的并发实现方式?
如果是前者,要设计好内存模型,让内存模型简单、易懂。其次就是编译器和处理器对内存模型的实现,让内存模型对编译器和处理器的约束越少越好,这样就能做尽可能多的优化来提高性能。
如果是后者,用好我在第一问中提到的那些技术,都可以搞定需求。
5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
并发/并行编程领域在理论方面这几年实际上没有取得什么进步。即使是比较火的技术,如Akka/Scala、Erlang,它们背后使用的是Actor模型,而Actor模型是Carl Hewitt在1973年提出的一个分布式并发编程模型,后来首先在Erlang/OPT中得到实现并加以应用、推广。
多核设计对并发编程领域能产生很大的影响,新的指令流水线方式,新的CPU架构,都可能影响到并发编程。
期待精彩回复:em27: 回复 5# jieforest
王楠w_n 发表于 2015-08-17 15:50 static/image/common/back.gif
shenlanyouyu总是这么给力 回复 2# shenlanyouyu
水娃啊:luya: 这段时间比较水,马上就要忙了。 回复 4# 王楠w_n
哈哈,我一向很给力,最近一段时间没目标漫游,所以比较闲。等一段时间就很忙了。 1:在你工作中是否有并发编程经历?简述一下。
在CPU还不是多核的时候就接触过并发编程,主要思想是状态机的方式实现,就是内部维护一个状态表,接收消息查询状态表调用对应的回调函数处理,处理完成后同时进行状态变迁,那时候程序是以多进程方式,一般是按照业务分层模式分多个进程,如业务处理进程,数据库处理进程等,每一个进程根据情况决定是否有状态机
2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式.
并发就是如何更大化的使用CPU资源,同一时间段内处理的任务越多越好,并发的实现主要有:状态机、多线程并发、actor模型等
3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求.
语言层次能提供更好,主要是对象不可修改更利于并发,此外资源不共享并发更有利,如内存分开或公共只读
4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
没到这个层次,只能用现有的方案
5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
我想大约就是scala actor之类的吧