博客
关于我
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 数据库重置ID排序
    查看>>
    Mysql 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>
    MySQL 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>