Java 并发性和多线程 & Java 内存模型

  1. java内存模型
  2. 全面理解Java内存模型(JMM)及volatile关键字
  3. http://ifeve.com/java-memory-model-6/ (English: http://tutorials.jenkov.com/java-concurrency/java-memory-model.html)
  4. http://www.infoq.com/cn/articles/java-memory-model-1

并发编程模型的分类

在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。

  • 共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式通信
  • 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式通信

同步是指程序用于控制不同线程之间操作发生相对顺序的机制

  • 共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。
  • 消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。

  1. Java 并发性和多线程
  2. Java中的多线程你只要看这一篇就够了
  3. http://wiki.jikexueyuan.com/project/java-concurrent/introduction.html
  4. Java工程师成神之路
  5. Java并发编程:深入剖析ThreadLocal
  6. https://blog.csdn.net/lufeng20/article/details/24314381

一句话概括:Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal的应用场合,最适合的是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。

  数据隔离的秘诀其实是这样的,Thread有个TheadLocalMap类型的属性,叫做threadLocals,该属性用来保存该线程本地变量。这样每个线程都有自己的数据,就做到了不同线程间数据的隔离,保证了数据安全。

猜你喜欢

转载自blog.csdn.net/a19576/article/details/82590023
今日推荐