Java同步线程的三种实现方式

 Java并发编程包含三个基本概念:

  • 原子性:一(多)个操作要么全部执行要么不执行,中途不会被打断;
  • 可见性:一个线程对某变量的修改对其他线程来说是可见的,即能知道值进行过修改;
  • 有序性:程序执行按照代码的顺序执行;

1.使用synchronized关键字修饰类或者代码块;

2.使用Volatile关键字修饰变量;

3.在类中加入重入锁

举例子:多个线程在处理一个共享变量的时候,就会出现线程安全问题。(相当于多个窗口卖票的操作)

非同步状态下:

复制代码
复制代码
public static void main(String[] args){
        Increase increase = new Increase();
        int count = 10;
        while (count != 0){
            new Thread(() -> {
                increase.increasementAndPrint();
            }).start();
            count --;
        }
    }

    static class Increase {
        private int i = 0;

        void increasementAndPrint() {
            System.out.print(i++ + "\n");
        }
    }
复制代码
复制代码

这种情况下可能会导致多个线程输出的i相同

使用同步:

复制代码
复制代码
1.使用synchronized关键字
//保证原子性和有序性
static class Increase {
        private int i = 0;

        synchronized void increasementAndPrint() {
            System.out.println(i++);
        }
    }
2.使用volatile
//不保证原子性(一个被volatile声明的变量主要有可见性,有序性)
static class Increase {
    private volatile int i = 0;

    void increasementAndPrint() {
        System.out.println(i++);
    }
}

volatile关键字不一定能够保证线程安全的问题,其实,在大多数情况下volatile还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:

  1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
3.使用重入锁
//保证原子性和有序性
static class Increase {
    private ReentrantLock reentrantLock = new ReentrantLock();
    private  int i = 0;

    void increasementAndPrint() {
        reentrantLock.lock();
        System.out.println(i++);
        reentrantLock.unlock();
    }
}
复制代码
posted @   威兰达  阅读(5205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示