两个线程按顺序打印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();
    }
}
目录
相关文章
|
Java
java有3个独立的线程,一个只会输出A,一个只会输出L,一个只会输出I。在三个线程同时启动的情况下,如何让它们按顺序打印ALIALI。
java有3个独立的线程,一个只会输出A,一个只会输出L,一个只会输出I。在三个线程同时启动的情况下,如何让它们按顺序打印ALIALI。
99 1
|
4月前
|
算法 安全 Java
三种方法教你实现多线程交替打印ABC,干货满满!
本文介绍了多线程编程中的经典问题——多线程交替打印ABC。通过三种方法实现:使用`wait()`和`notify()`、`ReentrantLock`与`Condition`、以及`Semaphore`。每种方法详细讲解了实现步骤和代码示例,帮助读者理解和掌握线程间的同步与互斥,有效解决并发问题。适合不同层次的开发者学习参考。
163 11
|
6月前
|
算法 Java 大数据
Java多线程中顺序打印
Java多线程中顺序打印
78 2
Java多线程中顺序打印
|
消息中间件 移动开发 自然语言处理
多线程知识:三个线程如何交替打印ABC循环100次
synchronized是Java中的一个关键字,用于实现对共享资源的互斥访问。wait和notify是Object类中的两个方法,用于实现线程间的通信。wait方法会让当前线程释放锁,并进入等待状态,直到被其他线程唤醒。notify方法会唤醒一个在同一个锁上等待的线程。
169 1
|
7月前
线程间通信实例之轮流打印ABC
线程间通信实例之轮流打印ABC
54 0
三个线程循环顺序打印
三个线程循环顺序打印
82 0
三个线程交替打印ABC100次问题思考
三个线程交替打印ABC100次问题思考
158 0
三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现
三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现
118 0
|
调度
leetcode 线程题 1114. 按序打印
leetcode 线程题 1114. 按序打印