Java多线程学习:常用概念

    xiaoxiao2023-11-01  34

    MESI协议

    MESI协议保证了每个缓存中使用的共享变成的副本是一致的。它的核心思想是:当CPU写入数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行值为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存的该变量是无效的,那么它就会从内存中重新读取最新的数据。

    核心概念

    并发编程中的三个核心概念: 原子性,可见性,有序性。

    原子性:

    即一个操作或者多个操作要么全部执行并且执行过程中不被任何因素打断,要么不执行。一个典型的银行转账问题:比如账户A给账户B转1000元,其中就包含了两个操作——从账户A中扣除1000元,给账户B添加1000元。如果2个操作不具备原子性的话,假如账户A减去1000元后,操作突然意外终止,那么就会导致账户A扣除了1000元,但是账户B并没有添加到1000元。

    可见性:

    可见性是指当多个线程同时访问一个变量时,一个线程修改了这个变量,其他线程能够立即得到这个变量修改后的值。在Java中,Java提供了关键字volatile关键字来保证可见性。当一个变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当其他线程需要读取时,它会去内存中读取新值。

    有序性:

    即程序执行的顺序按照代码的先后顺序执行;

    常见的几种并发模型:

    生产者-消费者

    一个或多个生产者创建某些工作并将其置于缓冲区或队列中,一个或多个消费者会从队列中获得这些工作并完成之。这里的缓冲区或队列是临界资源。当缓冲区或队列放满的时候,生产这会被阻塞;而缓冲区或队列为空的时候,消费者会被阻塞。生产者和消费者的调度是通过二者相互交换信号完成的。 读者-写者   当存在一个主要为读者提供信息的共享资源,它偶尔会被写者更新,但是需要考虑系统的吞吐量,又要防止饥饿和陈旧资源得不到更新的问题。在这种并发模型中,如何平衡读者和写者是最困难的,当然这个问题至今还是一个被热议的问题,恐怕必须根据具体的场景来提供合适的解决方案而没有那种放之四海而皆准的方法(不像我在国内的科研文献中看到的那样)。 哲学家进餐   1965年,荷兰计算机科学家图灵奖得主Edsger Wybe Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。这个问题可以简单地描述如下:五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一盘通心粉。由于通心粉很滑,所以需要两把叉子才能夹住。相邻两个盘子之间放有一把叉子如下图所示。哲学家的生活中有两种交替活动时段:即吃饭和思考。当一个哲学家觉得饿了时,他就试图分两次去取其左边和右边的叉子,每次拿一把,但不分次序。如果成功地得到了两把叉子,就开始吃饭,吃完后放下叉子继续思考。   把上面问题中的哲学家换成线程,把叉子换成竞争的临界资源,上面的问题就是线程竞争资源的问题。如果没有经过精心的设计,系统就会出现死锁、活锁、吞吐量下降等问题。

    线程的状态:

    最新回复(0)