并发编程三要素(线程的安全性问题体现在):
原子性:原子,即一个不可再被宰割的颗粒。原子性指的是一个或多个操作要么全副执行胜利要么全副执行失败。
可见性:一个线程对共享变量的批改, 另一个线程可能立即看到。(synchronized,volatile)
有序性:程序执行的程序依照代码的先后顺序执行。(处理器可能会对指令进行重排序)
呈现线程平安问题的起因:
● 线程切换带来的原子性问题
● 缓存导致的可见性问题
● 编译优化带来的有序性问题
解决办法:
● JDK Atomic 结尾的原子类、synchronized、LOCK,能够解决原子性问题
● synchronized、volatile、LOCK,能够解决可见性问题
● Happens-Before 规定能够解决有序性问题
并行和并发有什么区别?
● 并发:多个工作在同一个 CPU 核上,按细分的工夫片轮流 (交替) 执行,从逻辑上来看那些工作是同时执行。
● 并行:单位工夫内,多个处理器或多核处理器同时解决多个工作,是真正意义上的“同时进行”。
● 串行:有 n 个工作,由一个线程按程序执行。因为工作、办法都在一个线程执行所以不存在线程不平安状况,也就不存在临界区的问题。
做一个形象的比喻:
并发 = 两个队列和一台咖啡机。
并行 = 两个队列和两台咖啡机。
串行 = 一个队列和一台咖啡机。
什么是多线程,多线程的优劣?
多线程:多线程是指程序中蕴含多个执行流,即在一个程序中能够同时运行多个不同的线程来执行不同的工作。
多线程的益处:
能够进步 CPU 的利用率。在多线程程序中,一个线程必须期待的时候,CPU 能够运行其它的线程而不是期待,这样就大大提高了程序的效率。也就是说容许单个程序创立多个并行执行的线程来实现各自的工作。
多线程的劣势:
● 线程也是程序,所以线程须要占用内存,线程越多占用内存也越多;
● 多线程须要协调和治理,所以须要 CPU 工夫跟踪线程;
● 线程之间对共享资源的拜访会相互影响,必须解决竞用共享资源的问题。