java简单线程同步方法(volatile)实现线程同步

本文探讨了Java中多线程环境下非同步问题,重点介绍了volatile关键字的作用。volatile确保了变量在多线程环境中的可见性,但不保证原子性。示例代码展示了如何使用volatile实现线程同步,模拟柜台和ATM同时取钱的情景。这种方法简化了线程同步的实现。
摘要由CSDN通过智能技术生成

学习笔记

多线程中的非同步问题主要出现在对域的读写上,如果让域自身避免这个问题,则就不需要修改操作该域的方法。
用final域,有锁保护的域和volatile域可以避免非同步的问题。

  1. volatile关键字为域变量的访问提供了一种免锁机制,

  2. 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,

  3. 因此每次使用该域就要重新计算,而不是使用寄存器中的值

  4. volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

简单点说,就是
定义变量的时候在前面加一个volatile

 volatile int money2 = 100000;  //使用volatile方法实现线程同步

这是目前我发现最简单的方法
如果有更简单的同步线程的方法请在评论区留言,学习

示例
柜台和ATM同时取钱

//使用volatile方法实现线程同步
//

public class ren2 implements Runnable {
    volatile int money2 = 100000;  //使用volatile方法实现线程同步

    public ren2() {
        Thread t1=new MyThread();
        t1.start();

    }

    @Override
    public void run() {  //柜台取钱
        while (true) {
            money2 = money2 - 3;
            System.out.println("柜台取了两块钱,现在还有:" + money2);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    class MyThread extends Thread {  //ATM取钱
        public void run() {
            while (true) {
                money2 = money2 - 1;
                System.out.println("ATM取了一块钱,现在还有:" + money2);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }


    }

    public static void main(String[] args) {
        ren2 t2=new ren2();
        Thread t3=new Thread(t2);
        t3.start();


    }


}

水平有限,如有错误,还望大神指正;(^_−)☆

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心Fx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值