并发编程艺术

1.如何减少上下文切换

减少上下文切换的方法有无锁并发编程,CAS算法,使用最少线程和使用协程

2.如何解决资源限制的问题

对于硬件资源限制,可以考虑使用集群并行执行程序,既然单机的资源有限制,那么就让程序在多机上运行,比如使用ODPS,Hadoop或者自己搭建服务器集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。

对于软件资源限制,可以考虑使用资源池将资源复用。比如使用连接池将数据和Socket连接复用,或者在调用对方webservice接口获取数据时,只建立一个连接

3.volatile的两条实现原则

1.Lock前缀指令会引起处理器缓存回写到内存

2.一个处理器的缓存回写到内存会导致其他处理器的缓存无效

4.处理器如何实现原子操作

1.第一个机制时通过总线锁保证原子性

2.第二个机制是通过缓存锁定来保证原子性

但是有两种情况下处理器不会使用缓存锁定

第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line)时,则处理器会调用总线锁定

第二种情况是:有些处理器不支持缓存锁定。

5.CAS实现原子操作的三大问题

1.ABA问题

2.循环时间长开销大

3.只能保证一个共享变量的原子操作

6.在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信时指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递
7.Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序原完全透明。
8.happens-before规则

1.程序顺序规则:一个线程中的每一个操作,happens-before于该线程中的任意后续操作

2.监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁

3.volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读

4.传递性:如果A happens-before B,且B happens-before C,那么A happens-before C

9.未同步程序的执行特性

差异

1.顺序一致性模型保证单线程内的操作会按程序的顺序执行,而JMM不保证单线程内的操作会按程序的顺序执行(比如上面正确同步的多线程程序在临界区内的重排序)。

2.顺序一致性模型保证所有线程只能看到一致的操作执行顺序,而JMM不保证所有线程能看到一致的操作执行顺序。

3.JMM不保证64位long型和double型的变量的写操作具有原子性,而顺序一致性模型保证对所有的内存读/写操作都具有原子性。

10.由于Java的CAS同时具有volatile读和volatile写的内存语义因此Java线程之间的通信现在有了下面4种方式

1.A线程写volatile变量,随后B线程读这个volatile变量

2.A线程写volatile变量,随后B线程用CAS更新这个volatile变量

3.A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量

4.A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量

11.对于final,编译器和处理器要遵守两个重排序规则

1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序

2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序

12.线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会Java线程对于优先级的设定
13.锁降级指的是写锁降级成为读锁,如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级。锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程
14.合理地使用线程池能够带来3个好处

第一,降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗

第二,提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行

第三,提高线程的可管理性,线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配,调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。

15.在并发编程中使用生产者和消费者模式能够解决大多数并发问题。该模式通过平衡生产者和消费者的工作能力来提高程序整体处理数据的速度
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2025 Immanuel
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

微信