博客
关于我
多线程系列--synchronized
阅读量:514 次
发布时间:2019-03-07

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

synchronized(同步)机制是Java中用于保证线程安全的关键字,其核心作用是通过 monitor对象(monitor)实现线程间的竞争与阻塞。以下从多个维度阐述synchronized的特性及其与其他锁机制的比较。

synchronized的作用

synchronized通过传入一个monitor对象,实现了对共享资源的独占访问,主要目标是:

  • 保证原子性:在多线程环境下,保证关键操作为原子操作,避免数据竞争和不一致性。
  • 保持可见性:确保所有线程能够看到变量的最新状态。不过这一特性在现代Java虚拟机中已基本融入锁机制,默认提供可见性保证。

synchronized的使用方式

synchronized可以修饰方法、类或代码块,具体方式如下:

1.修饰普通方法

  • 修饰实例方法: 例子:public synchronized void increase() { this.i++; }
  • 修饰静态方法: 例子:public static synchronized void increase() { System.out.println("计数"); }

2.修饰代码块

  • 使用形式:synchronized (monitor) { ... }
  • monitor可是实例对象(如this)、类对象(如SomeClass.class)或任意对象引用。

synchronized的原理

synchronized基于Java虚拟机中的monitor机制。其实现关键在于monitor对象的进入和退出监视器机制:

monitor机制

  • monitorenter(进入监视器):尝试获取monitor的所有权。如果当前锁定者(owner)已释放锁,线程才能继续获取。一旦获取,进入计数器递增。
  • monitorexit(退出监视器):由持有者主动释放锁,允许其他线程重新获取锁。退出时,进入计数器递减。

这两种操作共同实现了monitor的偏向锁和锁重入功能。

synchronized与volatile的区别

虽然两者都用于线程安全,但有显著区别:

对比项 synchronized volatile
作用 核心锁定机制 保证可见性
应用范围 方法、类、代码块 让变量始终可见
安全性 原子性和可见性 只保证可见性
阻塞 可能造成阻塞 不阻塞

synchronized与Lock比较

synchronized是Java内置锁,简单易用,但存在以下局限:

对比项 synchronized Lock
锁释放机制 自动释放 手动释放
锁获取方式 Banner模态 支持多种方式
锁类型 非公平、不可重入 可重入、可中断
性能 重量级锁 轻量级锁

建议在轻量级资源竞争中使用Lock,因其性能优于synchronized。

synchronized与ReentrantLock比较

ReentrantLock是更高级的锁机制,具有synchronized的所有特性,并增强如下:

  • 多线程等待时可以提供公平锁(默认为非公平)。
  • 支持绑定多个锁条件。
  • 性能优异,特别是在资源竞争激烈时远胜synchronized。
  • 总结

    synchronized是Java中基础的线程同步机制,简单结构但适用范围广。在需要简单且全面同步的场景下,保持优势地位。对于高并发环境,推荐使用ReentrantLock。

    综上所述,理解synchronized机制是掌握Java多线程开发的关键。通过合理选择不同的锁机制,开发者可以根据实际需求实现高效、线性化的多线程程序。

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

    你可能感兴趣的文章
    Netty原理分析及实战(四)-客户端与服务端双向通信
    查看>>
    Netty客户端断线重连实现及问题思考
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0007---NIO的三大核心组件关系
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0057---Netty群聊系统服务端
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0063---WebSocket长连接开发2
    查看>>
    Netty工作笔记0070---Protobuf使用案例Codec使用
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty工作笔记0085---TCP粘包拆包内容梳理
    查看>>
    Netty常用组件一
    查看>>