java并发和多线程

本文深入探讨了Java中volatile关键字的作用及使用场景,包括其保证的可见性和禁止指令重排序特性,以及与synchronized和Lock接口等其他并发控制机制的对比。此外还介绍了可重入锁、读写锁的概念及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile—保证可见性、禁止指令重排序,不保证原子性

出于运行速率的考虑,java编译器会把经常访问的变量存放在缓存,直接从缓存中读取变量,多线程下内存与缓存不一样

volatile不会被缓存到寄存器,多线程下可见

使用条件:

  • 只有单个线程更新变量的值
  • 该变量不与其他变量一起纳入不变性条件中
  • 访问变量时不需要加锁

synchronized

    主动释放锁——发生异常,主动释放,不会死锁

    synchronized修饰多线程读,会阻塞

    synchronized(this)与synchronized(static XXX)的区别

    synchronized就是针对内存区块申请内存锁,this关键字代表类的一个对象,所以其内存锁是针对相同对象的互斥操作,而static成员属于类专有,其内存空间为该类所有成员共有,这就导致synchronized()对static成员加锁,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例。


Lock

    手动释放锁

    ReentrantLock:实现了Lock接口

ReadWriteLock(读写锁—接口)

    多个线程之间可以同时读


可重入锁(synchronized,ReentrantLock):线程可以进入它已经拥有的锁所同步的代码(锁计数器实现)

可中断锁(Lock):线程A正执行锁中的代码,B正等待获取该锁,由于等待时间过长,B响应中断去处理别的事情

公平锁(ReentrantLock—可设置):以请求锁的顺序来获取锁,即等待时间最长的

非公平锁(synchronized):无法保证等待的线程获取锁的顺序

读写锁(ReentrantReadWriteLock)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值