两个线程按顺序打印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();
    }
}
目录
相关文章
|
存储 C语言
大端存储和小端存储
1.大小端字节序 2.大端存储 3.小端存储 4.为什么会有大小端存储模式之分? 5.如何判断当前机器是大端存储还是小端存储 方法1 方法2
4390 0
|
存储 编解码 安全
冥王峡谷安装steamos踩坑记录
记录冥王峡谷安装第三方steamos-holoiso时遇到的一些问题,其它玩家可参考
4078 0
|
算法 安全 Java
三种方法教你实现多线程交替打印ABC,干货满满!
本文介绍了多线程编程中的经典问题——多线程交替打印ABC。通过三种方法实现:使用`wait()`和`notify()`、`ReentrantLock`与`Condition`、以及`Semaphore`。每种方法详细讲解了实现步骤和代码示例,帮助读者理解和掌握线程间的同步与互斥,有效解决并发问题。适合不同层次的开发者学习参考。
1308 11
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
536 5
算法系列之递归反转单链表
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
ELK 圣经:Elasticsearch、Logstash、Kibana 从入门到精通
ELK是一套强大的日志管理和分析工具,广泛应用于日志监控、故障排查、业务分析等场景。本文档将详细介绍ELK的各个组件及其配置方法,帮助读者从零开始掌握ELK的使用。
|
存储 固态存储 算法
文件系统中磁盘碎片整理
【10月更文挑战第8天】
562 2
|
存储 安全 Java
Java中的反射机制及其应用场景详解
Java中的反射机制及其应用场景详解
|
存储 运维 Dubbo
HSF:阿里RPC框架
HSF:阿里RPC框架
4968 0

热门文章

最新文章