两个线程按顺序打印1~100的几种实现

简介: 两个线程按顺序打印1~100的几种实现

两个线程按顺序打印1~100的几种实现方法
1.atomicIntegerImpl
2.volatileLockImpl
3.reentrantLockImpl
4.synchronizedImpl

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

class Solution {
    // synchronizedImpl使用的变量
    static Object lock = new Object();
    static int currentValue = 1;
    // Lock实现所需要的变量
    static ReentrantLock reentrantLock = new ReentrantLock();
    // volatile实现所需要的变量,volatile变量的单一操作,可以实现局部的同步效果
    // 但是volatile无法保证原子性,所以如果有i++这样的操作,volatile将会有问题
    // 也就是说,这里循环打印1/2,没有问题,但是如果题目是循环打印1~100的整数,就不可以单单用volatile了
    static volatile int currentXValue = 1;
    // AtomicInteger实现
    static AtomicInteger nAtomicInteger = new AtomicInteger(1);

    public static void main(String[] args) {
        // synchronizedImpl();
        // reentrantLockImpl();
        // volatileLockImpl();
        atomicIntegerImpl();
    }

    /**
     * 
     * @Title: atomicIntegerImpl
     * @Description:AtomicInteger实现
     * @author: itbird
     * @date 2022年3月16日 下午3:54:39 void
     */
    private static void atomicIntegerImpl() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (nAtomicInteger.intValue() % 2 == 0) {
                        System.out.println(Thread.currentThread().getName()
                                + "   " + nAtomicInteger.intValue());
                        nAtomicInteger.incrementAndGet();
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (nAtomicInteger.intValue() % 2 != 0) {
                        System.out.println(Thread.currentThread().getName()
                                + "   " + nAtomicInteger.intValue());
                        nAtomicInteger.incrementAndGet();
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }

    /**
     * 
     * @Title: volatileLockImpl
     * @Description: volatile实现
     * @author: itbird
     * @date 2022年3月16日 下午3:43:47 void
     */
    private static void volatileLockImpl() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (currentXValue % 2 == 0) {
                        System.out.println(Thread.currentThread().getName()
                                + "   " + currentXValue);
                        currentXValue++;
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (currentXValue % 2 != 0) {
                        System.out.println(Thread.currentThread().getName()
                                + "   " + currentXValue);
                        currentXValue++;
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }

    /**
     * 
     * @Title: reentrantLockImpl
     * @Description: ReentrantLock实现方式
     * @author: itbird
     * @date 2022年3月16日 下午3:40:30 void
     */
    private static void reentrantLockImpl() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        reentrantLock.lock();
                        if (currentValue % 2 != 0) {
                            System.out.println(Thread.currentThread().getName()
                                    + "   " + currentValue);
                            currentValue++;
                        }
                    } finally {
                        reentrantLock.unlock();
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        reentrantLock.lock();
                        if (currentValue % 2 == 0) {
                            System.out.println(Thread.currentThread().getName()
                                    + "   " + currentValue);
                            currentValue++;
                        }
                    } finally {
                        reentrantLock.unlock();
                    }
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }

    /**
     * @Title: synchronizedImpl
     * @Description: synchronized实现方式
     * @author: itbird
     * @date 2022年3月16日 下午3:14:43 void
     */
    public static void synchronizedImpl() {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (lock) {
                        if (currentValue % 2 != 0) {
                            System.out.println(Thread.currentThread().getName()
                                    + "   " + currentValue);
                            currentValue++;
                            lock.notify();
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (lock) {
                        if (currentValue % 2 == 0) {
                            System.out.println(Thread.currentThread().getName()
                                    + "   " + currentValue);
                            currentValue++;
                            lock.notify();
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }
}
目录
相关文章
|
SQL 缓存 算法
CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点
CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程; 如果是IO密集型任务,使用多线程,线程越多越好; 如果是CPU密集型任务,使用多进程,线程数量与CPU核心数匹配。
1663 0
|
Java Spring 容器
Spring的AOP失效场景详解
Spring的AOP失效场景详解
1554 0
|
SQL 存储 关系型数据库
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
13189 0
|
存储 安全 前端开发
微服务中使用阿里开源的TTL,优雅的实现身份信息的线程间复用
微服务中使用阿里开源的TTL,优雅的实现身份信息的线程间复用
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
|
7月前
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1222 16
|
10月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
算法 安全 Java
三种方法教你实现多线程交替打印ABC,干货满满!
本文介绍了多线程编程中的经典问题——多线程交替打印ABC。通过三种方法实现:使用`wait()`和`notify()`、`ReentrantLock`与`Condition`、以及`Semaphore`。每种方法详细讲解了实现步骤和代码示例,帮助读者理解和掌握线程间的同步与互斥,有效解决并发问题。适合不同层次的开发者学习参考。
716 11
|
存储 安全 Java
Java中的反射机制及其应用场景详解
Java中的反射机制及其应用场景详解
|
存储 缓存 自然语言处理
面试官问:Redis 是并发安全的吗?怎么做到的?
Redis作为一个非常成功的数据库,提供了非常丰富的数据类型和命令,使用这些,我们可以轻易而高效地完成很多缓存操作,可是总有一些比较特殊问题或需求需要解决,这时候可能就需要我们自己定制自己的 Redis 数据结构和命令。
面试官问:Redis 是并发安全的吗?怎么做到的?