Java多线程篇--原子包、阻塞队列和并行流

在之前的文章中,已经发布了常见的面试题,这里我花了点时间整理了一下对应的解答,由于个人能力有限,不一定完全到位,如果有解答的不合理的地方还请指点,在此谢过。

本文主要描述的是java多线程中提供的一些常用框架atomic、阻塞队列、并行流。原子类在某些场景下能够提高性能,避免使用锁。阻塞队列完成的是生产者消费者模型,这个在很多场景会使用到,包括线程池里面的一个重要参数就是阻塞队列。并行流结合lambda表达式能够改变我们的平时代码风格,但要注意的是需要关注一下线程安全问题。如果对java多线程感兴趣的同学可以看下公众号里多线程系列的文章,也许会对你有些帮助。

Atomic包中的内容有了解过,atomicinteger 和atomicintegerFiledUpdater 的区别是什么?

在java语言中,提供了atomic包,这个包中主要实现的是对数据原子类操作,其中的基础数据类型包含整型、布尔型、长整型、引用;数组类型包含整型数组、长整型数组、引用数组;更新器类型包含整型、长整型、引用。在这里面的绝大部分原子性操作都是通过CAS(compare and swap)来实现的。AtomicInteger 是基本数据更新器,我们直接在类中定义一个原子整型,后续的操作是对这个原子整型的操作。而AtomicIntegerFiledUpdater则是在一个model中定义一个整型,该整型不是原子整型,但是可以通过原子更新器每次原子更新该字段。为了更清晰的说明两个的使用方式,我们通过下面的例子来说明一下。

AtomicInteger:直接定义一个原子整型类进行使用。

public class AtomicIntegerTest {  

    public static void main(String[] args) {  

        AtomicInteger  integer = new AtomicInteger(0);//创建一个原子整型  

        for (int i =0;i<100;i++){  

            new Thread(new AddTest(integer)).start();  

        }  

    }  

  

    private static class AddTest implements Runnable{  

        private AtomicInteger data ;  

        public AddTest(AtomicInteger a) {  

            this.data = a;  

        }  

  

        @Override  

        public void run() {  

            System.out.println(Thread.currentThread().getName()+" get data i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您的问题是关于Java多线程的存钱取钱问题。这是一个经典的多线程同步问题,可以通过使用synchronized关键字来实现线程安全。下面是一个简单的示例代码: ```java public class BankAccount { private int balance; public BankAccount(int balance) { this.balance = balance; } public synchronized void deposit(int amount) { balance += amount; System.out.println("Deposit successful. Balance: " + balance); } public synchronized void withdraw(int amount) { if (balance < amount) { System.out.println("Withdraw failed. Insufficient balance."); return; } balance -= amount; System.out.println("Withdraw successful. Balance: " + balance); } } public class Main { public static void main(String[] args) { BankAccount account = new BankAccount(1000); // Create two threads to simulate deposit and withdraw Thread depositThread = new Thread(() -> { for (int i = 0; i < 5; i++) { account.deposit(100); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread withdrawThread = new Thread(() -> { for (int i = 0; i < 5; i++) { account.withdraw(200); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); depositThread.start(); withdrawThread.start(); } } ``` 在这个示例代码中,我们创建了一个银行账户类BankAccount,并在其中实现了deposit和withdraw方法,并使用synchronized关键字来保证线程安全。 在main方法中,我们创建了两个线程来模拟存款和取款操作,每个线程执行5次操作。我们使用Thread.sleep方法来模拟每个操作之间的间隔,以便更好地观察多线程操作的结果。 当多个线程同时访问BankAccount对象的deposit和withdraw方法时,synchronized关键字可以确保每个方法只能被一个线程访问,从而避免了竞争条件和数据不一致的问题。 希望这个示例代码能够回答您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值