免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

Java虚拟机编程技术大家谈---多核和并发编程(获奖名单已公布-2013-6-7) [复制链接]

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
31 [报告]
发表于 2013-05-29 09:38 |只看该作者
tong0245 发表于 2013-05-29 09:31
回复 29# 方兆国
哈哈哈

论坛徽章:
0
32 [报告]
发表于 2013-06-01 12:54 |只看该作者
本帖最后由 zavakid 于 2013-06-01 13:01 编辑

1、在Java虚拟机编程中您是否用到硬件多核技术?

JVM很早就支持并行编程了,jvm的线程使用的是操作系统的 native thread。使用jvm,其实就潜在的使用了多核编程。
本人在平时的代码中,使用了蛮多的多线程模型,特别是那种有IO瓶颈的操作,能并行就尽量并行了。

2、分享您在Java虚拟机或其他程序设计中并发编程的小技巧。

我用的比较多的是java,所以就是用了 ExecutorService, 其实底层还是使用了 ThreadPoolExecutor。
虽然使用 Executors 能够很方便的创建 ExecutorService,但他创建出来的模型,往往不能满足我们的需求,所以这里有几个小技巧分享下:
a. 尽量自己指定blocking队列的大小,这样的话你能够很好的控制内存,因为提交上来的任务,往往保持了一些数据,这些数据在任务没有被处理之前,是不会被gc掉的(因为被task持有)

b. ThreadPoolExecutor 里面的 corePoolSize 和  maximumPoolSize 的理解。以前认为是 corePoolSize 满了,就会扩增到 maximumPoolSize ,然后再往队列里放。
事实上,是先 corePoolSize, 然后再往队列里丢,等队列满了,再扩增到 maximumPoolSize。所以这里很容易引发bug,如果使用的是无界队列,那么这个 maximumPoolSize 其实就跟没有设置一样。

c. 尽量使用 threadFactory 来产生自定义名称的线程,这样在出现问题的时候,使用 jstack 能很快定位到工作线程。方便你对应用程序的诊断。

d. 使用 future 时,可以看下 CompletionService,他的作用是可以帮你把分发出去的线程结果进行排队,先谁做完,你就能获得谁的工作结果 —— 这种需求是非常常见的

3、抛开程序语言层面,谈谈您对多核和并发编程的看法。
事实上,java 里面线程之间的通信,是通过共享内存实现的,所以这里就少不了有 mutux,也就是需要同步。
然而,如果编程不当,同步很容易造成死锁,活锁等问题,这也对编写多线程的人提出了比较高的要求。

有了这样的问题,自然有人想解决。于是,有人说:既然造成 java 多线程这么难写的原因在于需要同步,那么如果我不用同步,那不就没有这个问题了!
于是,线程间的通信从共享内存变为了消息传递。
其实本质上就是把共享变为独占,你需要共享时,我就把它复制出来,这样你就不需要同步了吧!
于是,函数式编程又重新变成了大众的话题。因为纯函数从本质上来讲,是不会共享内存的——他通过参数来实现消息传递
并且,他不会有副作用(所以成为纯函数)。不过,肯定会有一些副作用的函数,比如IO。
所以,像 clojure —— jvm 上 lisp 的实现,渐渐的就进入了人们的视线。
所以,又有了 actor 这样的并发模式,其实本质就是通过消息传递来完成通信。

像 scala,既支持 actor 模式,又支持函数式编程,并且,还鼓励使用 val —— 其实就是类似于在 java 使用 final,因为不可变,所以不需要同步。
但是,actor这样的模型,底层还是建立在多线程的基础上的,只不过是对 编程者来讲更容易一些而已。
可以这么理解, actor 其实是在线程中模仿多个线程 —— 进程本身实现的更小粒度的“thread”
因此,常常可以看到人们提起一个结论:actor使用用来做CPU密集型的任务,而不要用来做io等操作——这是因为,一旦 actor 被阻塞了,这个线程后续的 actor 就被阻塞了。
就像 go 中,提供了协程,但同时,他还是需要提供 mutux 包的。

PS. 并行和并发是两个概念。 并行是真正的同时进行,一定需要多个CPU才能满足并行;而只有1个CPU的情况下,也可以实现并发,只要每个线程可以轮流得到时间片,就是并发。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
33 [报告]
发表于 2013-06-02 19:58 |只看该作者
如果用套接字通信的话,就要经常用到多线程了
线程池是个好东西,节约资源

论坛徽章:
0
34 [报告]
发表于 2013-06-03 11:15 |只看该作者
学习了                    

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2014-02-10 17:22:57技术图书徽章
日期:2014-02-18 08:44:12技术图书徽章
日期:2014-04-29 14:15:42
35 [报告]
发表于 2013-06-05 15:28 |只看该作者
1、在Java虚拟机编程中您是否用到硬件多核技术?
当处理器是多核时, 即Runtime.getRuntime().avaiableProcessors()大于1时,
如果我们在java代码中使用多线程,那么我们已经在用多核了,
如果等于1,那么也没有关系,CPU会切时间片给每个线程使用,开发人员并不需要太关注核心数.
当然,线程数过多反而会导致CPU频繁切换,并不能提供性能.
2、分享您在Java虚拟机或其他程序设计中并发编程的小技巧
jdk5的java.util.concurrent包提供的工具,对并发编程很有帮助,甚至不需要手动创建线程了.
性能上和开发难度上都比以前有优势,我觉得可以逐步替换掉以前的代码了.
3、抛开程序语言层面,谈谈您对多核和并发编程的看法。
并发本身是比较复杂的,只要使用了并发都要面对诸如互斥,竞争,可见性等问题,必须小心对待.
这些不仅是java特有的.

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
36 [报告]
发表于 2013-06-05 16:07 |只看该作者
控制线程数的话用线程池方便些,而且还可以减少资源消耗

论坛徽章:
0
37 [报告]
发表于 2013-06-05 16:23 |只看该作者
如果等于1,那么也没有关系,CPU会切时间片给每个线程使用,开发人员并不需要太关注核心数.

~~这还叫多核么。。肯定是要cpu大于1的。.有可能算是超线程。但这不属于多核编程吧。

论坛徽章:
0
38 [报告]
发表于 2013-06-07 13:33 |只看该作者
redcap0 发表于 2013-06-05 16:23
~~这还叫多核么。。肯定是要cpu大于1的。.有可能算是超线程。但这不属于多核编程吧。


嗯,一般都是并发编程。并发的程序可以运行在多核,也可以运行在单核上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP