[JAVA][面试][多线程]多方法解决循环打印1~n的数字

本文探讨了多种Java并发编程方法来解决循环打印1到n的数字问题,包括volatile、synchronized、wait/notifyAll、ReentrantLock、LockSupport和Semaphore。分析了每种方法的原理和效率,推荐使用Semaphore作为高效率解决方案。
摘要由CSDN通过智能技术生成

Summary

实现方法:

  1. volatile
  2. synchronized
  3. wait()/notifyAll()
  4. RetrantLock
  5. LockSupport
  6. Semaphore

从实现方式上来看,【方法1】和【方法2】都是基于JAVA语言的原生实现。
【方法1】采用的是共享内存的方式,【方法6】采用的是消息传递,都是借线程通信的方式控制并发;【方法2】、【方法3】、【方法4】、【方法5】采用的是加锁形式的并发控制。

  • 除了这几种方法外,还有管道、FIFO(同步队列)等实现方式,此略。

注:本质上,该问题是并发控制问题,因此可以采用线程通信的方式解决;而线程通信主要有两种机制:共享内存消息传递,而消息传递亦可以基于共享内存来间接实现(非严格实现)。即,JAVA的并发采用的是隐式共享内存模型,但是在此基础上,并发包中诸如信号量等消息传递的线程通信机制亦已基于共享内存的方式非严格间接实现。

  • 除标明外,为了篇幅间接,本文中仅提供核心代码,完整代码及细节见:@gist@码云

1. volatile

要注意的是,volatile本身无原子性(如,a++),但对单个变量的读写具有原子性(如,a=1)。

volatile 关键字保证了共享变量的 ”可见性“,及其通过总线锁、内存屏障(解决重排序问题)的方式,在不引起线程上下文切换的状态下(因此比synchronized效率高),使一个变量总是对所有线程可见。

  • 这不是一个高效的解决方式,但是是一个面试官可以接受的回答。这里采用自旋的方式,效率较低。

在本例中的实现代码如下(完整):

public class syn {
   
    private static volatile int order = 0;  // 使用 volatile
    private static int n = 10;
    
    public static void main(String[] args){
   
        for(int i=0; i<syn.n; i++){
   
            new Thread(new R(i)).start();
        }
    }

    static class R implements Runnable{
   
        private int id;
        public R(int id){
   this.id = id;}

        @Override
        public void run() {
   
            while(true){
   
                if(syn.order == this.id){
    // 此处靠只读,保证原子性
                    System.out.println(this.id);
                    syn.order = (syn.order+1) % syn.n; // 保证了此处的原子性
                }
            }
        }
    }
}

也可以选择在共享变量上自旋:

public void run() {
   
    while(true){
   
        while(syn.order != this.id){
   } // 自旋

        System.out.println(this.id);
        syn.order = (syn.order+1) % syn
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值