用多线程的目的:更好的利用CPU的资源。因为所有的多线程代码都可以用单线程来实现。
多线程:指的是这个程序(一个进程)运行时产生了不止一个线程。
并行:多个CPU实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU操作层面不是真正的同时。
线程安全:经常用来描绘一段代码。指在并发的情况下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要
关注系统的内存,CPU是不是够用即可。
线程不安全:线程的调度顺序会影响最终结果,如不加事务的转账代码。
同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问称为线程安全,来保证结果的准确。在保证结果准确的同时,提高性能,才是优秀的程序。
线程安全的优先级高于性能。
Java的并发采用的是共享变量模型
Java线程之间的通信由Java内存模型控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。
从图中可以看出,如果线程A与线程B之间要通信的话,必须要经历下面两个步骤:
1、线程A把本地内存A中更新过的共享变量刷新到主内存中去。
2、线程B到内存中去读取线程A之前已更新过的共享变量。
可通过下面例子来说明这两个步骤:
如图所示,本地内存A和本地内存B由主内存中共享变量x的副本。假设在最开始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。
当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为1.随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内
存的x值也变为1。
从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。
参考资料:http://www.jianshu.com/p/40d4c7aebd66