final可见性理解

博客主要介绍了final常量的可见性,指出final常量无需同步,就能被其他线程正确访问,涉及Java编程中多线程对常量的访问特性。

final可见性理解:

 

final 常量无需同步,就能被其它线程正确访问

Java锁的可见性是并发编程中的重要概念,它确保了在多线程环境下,一个线程对共享变量的修改能够被其他线程及时看到。 ### 可见性原理 当一个线程进入`synchronizer`代码块后,线程获取到锁,会清空本地内存,然后从主内存中拷贝共享变量的最新值到本地内存作为副本,执行代码,又将修改后的副本值刷新到主内存中,最后线程释放锁。这样,其他线程在获取锁进入相同代码块时,就能从主内存中获取到最新的共享变量值,从而保证了变量的内存可见性 [^2]。 ### 无锁编程与可见性 对于需要频繁访问和修改共享变量的场景,无锁编程技术可能是一个更好的选择。通过利用原子变量(AtomicVariable)等无锁数据结构,可以在不引入锁的情况下实现线程间的数据同步和可见性。这种策略能够显著提高系统的并发性能,但需要开发者对并发编程有深入的理解和实践经验 [^3]。 ### 显示锁与可见性 显示锁基于JDK API、AQS、乐观锁实现,需要显式的加锁以及释放锁。无阻塞的同步机制(非公平锁实现)可实现轮询锁、定时锁、可中断锁特性;提供了一个`Condition`(条件)类,对锁进行更精确的控制。默认使用非公平锁,可插队跳过对线程队列的处理(因此被称为可重入)。`ReentrantLock`的内部类`Sync`继承了AQS,分为公平锁`FairSync`和非公平锁`NonfairSync`。在获取和释放锁的过程中,也会涉及到共享变量的内存刷新,从而保证可见性 [^4]。 ### 公平锁与非公平锁的可见性 公平锁线程获取锁的顺序和调用`lock`的顺序一样,FIFO;非公平锁线程获取锁的顺序和调用`lock`的顺序无关,先执行`lock`方法的锁不一定先获得锁。无论是公平锁还是非公平锁,在加锁和解锁过程中,都会保证共享变量在主内存和线程本地内存之间的同步,从而保证可见性 [^4]。 ### 代码示例 ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockVisibilityExample { private static int sharedVariable = 0; private static final Lock lock = new ReentrantLock(); public static void main(String[] args) { Thread writer = new Thread(() -> { lock.lock(); try { sharedVariable = 1; } finally { lock.unlock(); } }); Thread reader = new Thread(() -> { lock.lock(); try { System.out.println("Shared variable value: " + sharedVariable); } finally { lock.unlock(); } }); writer.start(); reader.start(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值