Java多线程详解(原子性、有序性、可见性),夯实基础就在今天

本文详细探讨了Java多线程中的可见性、原子性和有序性,通过实例展示了volatile关键字如何确保可见性,以及非原子操作在并发环境中的问题。文章还提到了synchronized关键字在保证原子性方面的作用,并指出JMM允许的指令重排可能影响多线程的正确性。
摘要由CSDN通过智能技术生成

为什么需要并发,多线程?

  1. 时代的召唤,为了更充分的利用多核CPU的计算能力,多个线程程序可通过提高处理器的资源利用率来提升程序性能。

  2. 方便业务拆分,异步处理业务,提高应用性能。

多线程并发产生的问题?

  1. 大量的线程让CPU频繁上下文切换带来的系统开销。

  2. 临界资源线程安全问题(共享,可变)。

  3. 容易造成死锁。

注意:当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变量是在每个线程的私有栈中,因此不具有共享性质,不会导致线程安全问题。

可见性

多线程访问同一个变量时,如果有一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。这是因为为了保证多个CPU之间的高速缓存是一致的,操作系统会有一个缓存一致性协议,volatile就是通过OS的缓存一致性协议策略来保证了共享变量在多个线程之间的可见性。

public class ThreadDemo2 {

private static boolean flag = false;

public void thread_1(){

flag = true;

System.out.println(“线程1已对flag做出改变”);

}

public void thread_2(){

while (!flag){

}

System.out.println(“线程2->flag已被修改,成功打断循环”);

}

public static void main(String[] args) {

ThreadDemo2 threadDemo2 = new ThreadDemo2();

Thread thread2 = new Thread(()->{

threadDemo2.thread_2();

});

Thread thread1= new Thread(()->{

threadDemo2.thread_1();

});

thread2.start();

try {

Thre

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值