博客
关于我
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/

    你可能感兴趣的文章
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>
    mysql-5.7.18安装
    查看>>
    MySQL-Buffer的应用
    查看>>
    mysql-cluster 安装篇(1)---简介
    查看>>
    mysql-connector-java.jar乱码,最新版mysql-connector-java-8.0.15.jar,如何愉快的进行JDBC操作...
    查看>>
    mysql-connector-java各种版本下载地址
    查看>>
    mysql-EXPLAIN
    查看>>
    MySQL-Explain的详解
    查看>>
    mysql-group_concat
    查看>>