【JUC】记“Java实现两个线程交替相加1-100”

本文探讨了使用synchronized关键字实现线程安全的方法,包括锁对象的final修饰、volatile保证内存可见性及预防wait()虚假唤醒等问题,并附上了一个两线程交替增加共享变量的例子。

一、一些想法

最近看了一些有有关并发下对共享变量操作的博客,总感觉代码要不是重复代码多,要不就是没考虑到wait()被虚假唤醒的问题,考试或者入门虽然足够,但是多少会有些带偏新人的危险,所以这里记下我的一些想法,希望一起讨论:

1、Sychronized作用:

sychronized提供了保证每个线程对共享变量加1时操作的原子性和代码段得有序性,这里用Object作为锁,锁住下面的共享代码块;

2、lock对象用final修饰并初始化:

在IDEA里,如果lock锁对象没有被修饰为常量,会有一个警告,究其原因是防止其他线程修改lock造成不必要的麻烦,既然是常量,那么就得在声明的时候完成初始化;

3、volatile修饰共享变量:

volatile保证共享变量的内存可见性;

4、wait()防止虚假唤醒:

wait()后的对象可能没有经过notify唤醒便恢复到就绪状态,这叫做wait()的虚假唤醒,实际这种情况出现也不是很多,但是代码习惯要求我们显性得处理这个问题,也就是循环wait(),在这里我的循环条件是只要n没有变化那就一直阻塞。

二、完整代码

public class AlternateAddition {
    public static volatile int n = 0;
    public final static Object lock = new Object();

    public static void increase() {
        while (n <= 100){
            synchronized (lock) {
                if (n <= 100) {
                    lock.notify();
                    int temp = n++;
                    System.out.println(Thread.currentThread().getName() + " : " + "n = " + n);
                    while (temp == n - 1) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        new Thread(TwoThreadAdd::increase).start();
        new Thread(TwoThreadAdd::increase).start();
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值