其他分享
首页 > 其他分享> > 聊聊并发

聊聊并发

作者:互联网

在并发编程领域,有两个关键问题:线程之间的通信和同步。   线程之间的通信 并发工具类 1、CountDownLatch 2、CyclicBarrier 3、Semaphore 4、Exchanger 5  CountdownLatch的加强版 phaser   线程的通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。   在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。   在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify()。   关于Java线程之间的通信,可以参考线程之间的通信(thread signal)。   线程之间的同步 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。   在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。 Java的并发采用的是共享内存模型 Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。   并发编程有什么缺点 并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题, 比如**:内存泄漏、上下文切换、线程安全、死锁**等问题。     并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全? 并发编程三要素(线程的安全性问题体现在): 原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile) 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)   出现线程安全问题的原因: 线程切换带来的原子性问题 缓存导致的可见性问题 编译优化带来的有序性问题   解决办法: JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题 synchronized、volatile、LOCK,可以解决可见性问题 Happens-Before 规则可以解决有序性问题

标签:编程,通信,并发,线程,聊聊,之间,共享内存
来源: https://www.cnblogs.com/labimeilexin/p/16485984.html