jieforest 发表于 2015-08-19 16:04

回复 6# 王楠w_n


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

王楠w_n 发表于 2015-08-19 16:26

:em18: 回复 11# jieforest


   

xuzhou2015 发表于 2015-08-20 09:09

并发,多线程, 是java中比较让人头疼的
java 启动多线程,效率就低。锁的太厉害了。
我都是 将资源 扔到BlockQueue中, 让java自己同步

kaduo521 发表于 2015-08-20 10:47

攒积分,,顶下

cnlnzz01 发表于 2015-08-24 11:07

rover12421 发表于 2015-08-24 13:37

1:在你工作中是否有并发编程经历?简述一下。
以前自己写了一个简单多线程的网络爬虫,一个管理线程,几个工作线程.管理线程主要用来监听是否有退出事件,工作线程是否挂掉.工作线程就只管爬数据,读写数据库.再这个案例里,主要是控制好数据库的同步.java层的数据同步都是直接使用"synchronized"关键词解决.

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

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

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

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

孤独的战神 发表于 2015-08-24 17:29

顶起。。。。

awyc 发表于 2015-08-25 12:11

楼主关注我。。

chenxing2 发表于 2015-08-25 20:32

我关注你了 {:yct44:}回复 18# awyc


   

shenlanyouyu 发表于 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内部数据只有被自己修改。
页: 1 [2] 3
查看完整版本: 和阿里大拿一起聊聊Java并发那些事儿