免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: CUTianrui007

和阿里大拿一起聊聊Java并发那些事儿 [复制链接]

论坛徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2015-08-19 16:04 |显示全部楼层
回复 6# 王楠w_n


    呵呵,我率先回答了,算是抛砖引玉吧!

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2015-08-19 16:26 |显示全部楼层
回复 11# jieforest


   

论坛徽章:
0
发表于 2015-08-20 09:09 |显示全部楼层
并发,多线程, 是java中比较让人头疼的
java 启动多线程,效率就低。  锁的太厉害了。
我都是 将资源 扔到  BlockQueue中, 让java自己同步

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-08-23 06:20:00
发表于 2015-08-20 10:47 |显示全部楼层
攒积分,,顶下

论坛徽章:
9
IT运维版块每日发帖之星
日期:2015-08-27 06:20:00IT运维版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-23 06:20:00IT运维版块每日发帖之星
日期:2015-11-22 06:20:00操作系统版块每周发帖之星
日期:2015-12-02 15:01:04白银圣斗士
日期:2015-12-07 18:37:03数据库技术版块每日发帖之星
日期:2015-12-10 06:20:00数据库技术版块每周发帖之星
日期:2016-02-03 16:55:092017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2015-08-24 11:07 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2015-08-24 13:37 |显示全部楼层
1:在你工作中是否有并发编程经历?简述一下。
以前自己写了一个简单多线程的网络爬虫,一个管理线程,几个工作线程.管理线程主要用来监听是否有退出事件,工作线程是否挂掉.工作线程就只管爬数据,读写数据库.再这个案例里,主要是控制好数据库的同步.java层的数据同步都是直接使用"synchronized"关键词解决.

2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式.
并发就是利用多核cpu的特性,让多核cpu都能同时工作.单不是线程数越多越好,工作线程数最好等于cpu核心数.多了反而会因为cpu上下文切换的时间消耗过大,降低多核的优势.
我知道的实现有状态机,actor.听过,都不熟悉.

3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求.
主要是要解决数据同步问题.再内存模型里有一个立即数的概率.然后解决同步多是用锁来解决.

4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
能力不够啊,还是用好现有的再说吧...

5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
好像jvm上最新的一个概念是actor,不知道是不scala提出的,看很多讲actor的时候都会设计到scala.
现在很多多线程设计都设计到锁的机制,用起来也越来越简单,但是线程互锁,很多是罗辑层面导致的,
下一代我觉得线程互锁应该会更容易的避免吧

论坛徽章:
0
发表于 2015-08-24 17:29 |显示全部楼层
顶起。。。。

论坛徽章:
0
发表于 2015-08-25 12:11 |显示全部楼层
楼主关注我。。

论坛徽章:
13
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:002017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29极客徽章
日期:2016-12-07 14:08:02JAVA
日期:2016-10-25 16:01:09luobin
日期:2016-06-17 17:46:362016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之天津
日期:2015-12-16 22:35:03黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-10-09 06:20:002015亚冠之广州恒大
日期:2015-09-21 21:40:222015七夕节徽章
日期:2015-08-21 11:06:17
发表于 2015-08-25 20:32 |显示全部楼层
我关注你了   回复 18# awyc


   

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
发表于 2015-09-04 00:40 |显示全部楼层
1:在你工作中是否有并发编程经历?简述一下。
自己做的第一个项目就涉及到并发编程。设计一个中间件middleware层,实现中间数据的收发和处理,使用了3个thread,一个thread负责从底层接收数据,并送往上层;一个thread负责从上层接收数据,处理后发送到下层;另一个thread是监控线程,接收其他模块的控制信息。为什么要采用三个线程来完成工作?这样的设计是为了提高系统的throughput,将数据的发送和接收处理分开,由于和上层模块间通信需要访问共同的buffer,采用了mutex来同步。

2:你对并发编程是如何理解的?简述你所知道的并发编程的实现方式.
我对并发编程的理解是:并发编程是为了提高程序的运行效率,最大程度地利用CPU资源,多个程序被轮换调度执行。现今的计算机系统架构,各个模块的执行速度差异很大。CPU的指令执行速度,但是内存、硬盘数据存取的限制了程序的运行速度,程序的很大一部分执行时间被浪费在IO wait上面。为了提高CPU的效率,在一个程序等待硬盘或其他速度较慢的外设时,调度另一个程序执行,达到并发的效果。
谈到并发,顺便说说并行。并行是指多核处理中,指令在多个CPU上并行执行。
我知道的并发编程的实现方式:
1.多进程。在Linux系统最早没有线程的概念,并发都是采用多进程方式,Nginx也是采用的多进程模式,为了减少进程频繁调度,切换上下文的时间,采用CPU亲和性来避免。多进程方式的并发模型的缺点是进程调度时开销较大,进程的个数最好和CPU数量相同。
2.多线程。线程共享进程的地址空间,因此采用多线程的模式,线程切换的开销小。
3.协程。在单线程里实现多任务的调度,并在单线程里维持多任务的切换。
4.I/O多路复用。在单线程控制多个异步业务逻辑,通过事件驱动多个业务的状态处理。所有业务实例的逻辑在单一线程中处理,可以解决竞争和死锁问题节省了进程空间开销,没有上下文切换问题,提高CPU的利用率。例如Java NIO,在jdk1.4开始使用的。由一个专门的线程来处理所有的 IO 事件,并负责分发。采用了事件驱动机制,线程之间通wait,notify 等方式通讯,保证每次上下文切换都是有意义的。

3:并发编程对语言层次提出了什么样的要求?比如对内存模型设计有什么要求,对语言架构设计有什么要求.
并发编程对语言层次提出了同步的要求,需要解决线程之间如何通信及线程之间如何同步的问题。例如Java语言提供了synchronized、volatile和final同步原语。
对内存模型设计要求实现共享内存机制,线程之间共享程序的公共状态通过写-读内存中国的公共状态进行隐式通信。例如Java内存模型规定所有的共享变量都存储在JVM主内存中,每个线程有自己私有的本地内存,它存储被该线程使用的变量的主内存拷贝,线程对这些变量的操作都在自己的工作内存中进行,不能直接操作主内存和其它工作内存中存储的变量或者变量副本,线程间的变量访问需通过主内存来完成。

4:如果让你设计并发编程的一个实现方式,简述一下你的思路。
我会参考Nginx的并发实现方式,但是会引入线程并发机制,采用事件驱动。为了减少线程程的频繁调度,切换上下文的时间,采用CPU亲和性来避免,线程个数和CPU数量相同。

5:如果让你想象,并发编程的下一代编程方式会是什么样子呢?
现在基于actor模型的并发编程比较火,Actor模型内部的状态由自己的行为维护,外部线程不能直接调用对象的行为,必须通过消息才能激发行为,这样就保证Actor内部数据只有被自己修改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP