• Single Threaded Execution


    模式概要

    通过加锁的方式,使得只有一个线程才可以进入临界区,保证数据的原子读写操作。

    使用范围

    1. 多线程模式

    只有多线程模式下才需要使用synchronized实现隔离,单线程程序无需考虑竞争问题。

    2. 多线程访问

    多个线程同时访问共享资源时,需要使用synchronized隔离。如果线程之间操作的数据互不影响,也不需要考虑。

    3. 共享资源的状态会发生改变

    当共享资源的状态(可以理解为成员变量)不会发生任何改变时,无需考虑线程安全问题

    死锁的发生条件

    1. 存在多个共享资源

    2. 存在需要获取多个共享资源的场景

    3. 获取共享资源的顺序是不固定的

    如何打破死锁?只要打破上面三个条件中的任何一个即可避免产生死锁。

    使用注意事项

    1. 被保护资源的原子性

    要注意被保护资源之间是否存在关联关系,例如A和B的读写是否存在原子性,是否同时读写。

    1. // 原子
    2. synchronized{
    3. A = ++a;
    4. B = ++b;
    5. }
    1. synchronized{
    2. A = ++a;
    3. }
    4. synchronized{
    5. B = ++b;
    6. }

    2. 共享资源的保护需要完整性

    必须考虑所有读写共享资源的位置,防止考虑不周全导致某些位置无法得到保护。

    3. long和double读写不是原子操作

    4. 注意锁定的是什么资源,只有锁定相同资源的线程之间可以控制并发读写

    扩展

    syncoronized可以保证只有一个线程可以访问资源,而semophere可以保证最多N个线程可以同时访问资源。

  • 相关阅读:
    数据结构——二分查找法
    NNDL:作业五
    helm2.0安装及部署
    [Mybatis-Plus笔记] MybatisPlus-03-QueryWrapper条件构造器
    C++中或运算符(||)执行的逻辑及顺序
    HTML这一篇就够啦~
    vscode中文乱码问题及几种常见的解决方案
    [CISCN2019 华东南赛区]Web11
    DHorse的链路追踪
    基于 element ui 之 ui-tooltip 组件
  • 原文地址:https://blog.csdn.net/Day_and_Night_2017/article/details/126945395