博客
关于我
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 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>