博客
关于我
145.线程同步
阅读量:798 次
发布时间:2019-03-25

本文共 1164 字,大约阅读时间需要 3 分钟。

线程同步与synchronized机制解析

组内多线程访问共享对象时,容易出现数据竞争和Visibility错误,影响程序的正确性。为此我们需要引入线程同步机制,确保同一进程中多线程能安全访问共享资源。

线程同步机制的本质是一个等待池,将需要同时访问共享对象的线程存入队列等待。第一位线程执行完毕后,第二位线程可以利用资源。接下来,我们将具体解析synchronized机制及其应用。

线程同步问题

  • 锁竞争:当一个线程持有锁时,其他所有需要此锁的线程会被挂起进入等待状态,直到当前线程释放锁。这可能导致大幅增加上下文切换次数,影响性能表现。

  • 优先级问题:在多线程竞争环境下,优先级高的线程可能因等待优先级较低的线程释放锁而导致优先级倒置,引发资源争夺频率增加、性能浪费问题。

  • 资源利用:资源被先卡住的线程占用,造成资源闲置浪费,降低系统资源利用率。

  • Synchronized机制解析

    Synchronized是实现线程安全的核心机制,用于保证多线程访问共享资源时的正确性。Synchronized同时兼顾了方便性和性能,适用于资源有限的环境下的线程安全管理。它的关键作用是确保对共享资源的访问是原子的、可见的,并被其他线程所检测。

    Synchronized方法

    Synchronized方法主要用于保护共享成员变量和类变量。每个对象都持有一把锁,只有获得该锁的线程才能进入该方法,其他线程需要等待。这保证了方法执行时的线程独占特性,防止数据竞争和Visibility错误。

    synchronized方法特点:
  • 阻塞性:如果当前线程未能获得锁,就会进入等待状态,直到锁被释放。

  • 豁让性:方法执行完成后,自动释放锁,其他被挂起的线程可继续竞争锁。

  • 同步性:方法内的操作是原子性的,其他线程看到的是一致的状态。

  • 可见性:其它线程可感知到锁的状态变化,进入等待或通知状态。

  • Synchronized块

    为了充分发挥锁机制的优势,尽量将控制流逻辑分解为较小的代码块,使用synchronized块。这样可以减少块粒度的影响,提升性能表现。事实上,每一块 Sync都对应一把锁,每个关键代码段的控制权最大限度地划分至单独的锁获取和释放。

    synchronized块优化原则:
  • 最小粒度:确保每个需要独占资源的代码块单独作为Sync块。

  • 必要性:只有当多个线程可能同时访问该代码块时,才需要使用Sync。

  • 读写分离:读写分离的代码块无需同步,减少不必要的阻塞。

  • 上述synchronized机制充分体现了对线程安全的深刻理解,为现代多线程应用提供了可靠的基础保障。通过合理的锁块划分,可以在保证线程安全的前提下实现较高的性能表现。

    优化后的内容篇幅大约500字,准确传达核心信息,保持了技术内容的专业性和可读性,可直接用于技术文档或教育培训。

    转载地址:http://trdyk.baihongyu.com/

    你可能感兴趣的文章
    Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
    查看>>
    Python 八大排序算法合集
    查看>>
    python 关于epoll的学习
    查看>>
    Python 内存管理
    查看>>
    Python 内嵌函数:它们有什么用处?
    查看>>
    Python 内置 sum 函数 vs. for 循环性能
    查看>>
    Python 内置时间模块
    查看>>
    python 内部如何实现命名元组?
    查看>>
    python 写入json数据到数据库
    查看>>
    Python 列表删除相同的元素
    查看>>
    Python 初学者需要知道的四条建议
    查看>>
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>