`
cywhoyi
  • 浏览: 422005 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

前言:

    Java语言作用很大,因有众多分门杂类的开源框架导致Javaer关注高并发细节问题偏少,常常被面试或者面试的时候,别人总是问你current的包,但是却很少人会询问你,“这段代码在高并发的情况下,会出现问题?我们应该如何改写呢?”所以本篇博客我想从最简单的demo,到支持高并发场景的,如果觉得过程中有问题问大家赐教。

 

案例:

   经典多线程并发问题就是生产者消费者问题,以下列子中,我会加入多种条件,而非一个纯种的生产者-消费者模式,可能很多人会觉得现在有了concurrent的PKG下的一大堆ArrayBlockQueue,但今天主题是如何优化改进。

demo,非安全的

 

public class UserAccount {
    private int balance;
    private long maxMoney = 5000000;
    private long minMOney = 1000000;

    public UserAccount(int balance) {
        this.balance = balance;
    }

    public void deposit(int amount) {
        while (balance + amount < maxMoney) {
            balance += amount;
            System.out.printf("存:" + balance);
        }

    }

    public void withdraw(int amount) {

        while (minMOney > balance - amount) {
            balance -= amount;
            System.out.println("取:" + balance);
        }
    }
}

 

第一步: 上面的代码很明显会出现并发问题,简单点我们加入synchronized

 

public class UserAccount {
    private int balance;
    private long maxMoney = 90000000;
    private long minMOney = 1000000;

    public UserAccount(int balance) {
        this.balance = balance;
    }

    public synchronized void deposit(int amount) {
//        synchronized (this) {
            while (balance + amount < maxMoney) {
                balance += amount;
                System.out.println("存:" + balance);
            }

        }
//    }

    public synchronized void withdraw(int amount) {

        while (minMOney > balance - amount) {
            balance -= amount;
            System.out.println("取:" + balance);
        }
    }
}
 第二步:有没有发现加入关键字synchronized后,是并发问题解决了,但是我们锁的范围太广了,不懂得可以看下synchronized的说明。(当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行)

 

    public void deposit(int amount) {
        synchronized (this) {
            while (balance + amount < maxMoney) {
                balance += amount;
                System.out.println("存:" + balance);
            }

        }
    }
 第四步:实际过程中,往往我们不会只有一个条件,这时候使用到ReentrantLock
  private final Lock monitor = new ReentrantLock();

    private final Condition low = monitor.newCondition();

    private final Condition high = monitor.newCondition();

    public UserAccount(int balance) {
        this.balance = balance;
    }

    public void deposit(int amount) {
        monitor.lock();
        try {
            while (balance + amount < maxMoney) {
                balance += amount;
                System.out.println("存:" + balance);
            }

            low.signal();
        } finally {
            monitor.unlock();
        }
    }
 第五步:锁升级,加入读写锁ReentrantReadWriteLock
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void read() {
        lock.readLock().lock();
        System.out.println(balance);
        lock.readLock().unlock();
    }
 
第六步:使用Atomic原子类
 
第七步:使用violate
 假设你的资源类中violate修饰的变量读的频繁程度远远大于写,那么violate修饰的变量就派上用场。
private volatile int value;

    public int getValue() {
        return value;
    }

    public int increment() {
        synchronized (this) {
            return value++;
        }
    }
 
第八步 异步处理
	CompletableFuture.supplyAsync(() -> {do something();}, taskExecutor);
 
未完待续...
0
4
分享到:
评论
5 楼 cywhoyi 2016-02-29  
lionld23 写道
等着看呢,速度速度

我是抽空再写的,整篇文章范畴太大啦,牵扯到的东西尽量广一点
4 楼 lionld23 2016-02-26  
等着看呢,速度速度
3 楼 lzlg302 2016-02-25  
等待佳作
2 楼 cywhoyi 2016-02-25  
龘龘龘 写道
没了?没了?没了?没了?没了?没了?

我想哭啊,没保存,再重写过程中。。。
1 楼 龘龘龘 2016-02-25  
没了?没了?没了?没了?没了?没了?

相关推荐

    java高并发项目的demo

    这个"java高并发项目的demo"提供了一个实例,展示了如何处理大量并发请求。以下将详细阐述涉及的关键技术及其作用。 首先,Redis作为一个高性能的键值存储系统,在高并发场景下常被用作缓存来减少数据库的压力。在...

    高并发多线程处理demo-java.rar

    这个"高并发多线程处理demo-java.rar"压缩包提供了一个实际的Java实现,展示了如何构建一个并发队列来接收数据,并通过多线程进行处理。以下是对这个实例中的知识点进行的详细解释: 1. **Java多线程**:Java通过`...

    c# tcp 基于完成端口开发 高性能 高并发 吞吐量大 包含服务端 客户端完整代码 支持最大连接数支持65535个长连接

    本资源提供的是一套基于C#语言实现的TCP服务器和客户端代码,利用了完成端口(IO Completion Ports, I/OCP)技术来优化高并发和高性能的网络通信。 完成端口是Windows系统中的一种高级I/O模型,它通过将I/O操作的...

    sprint boot整合netty5实现高并发websocket,不过netty5官网已经不推荐

    spring boot demo,整合netty5实现高并发websocket,并引入slf4g+lombok,采用maven形式; 直接导入运行,有测试页面也有实现代码及详细注释,src/main/webapps/TestNettyWebSocket.html里第十行改成 ws://localhost...

    多线程并发的demo

    在Web项目中,多线程的使用还需要考虑线程安全问题,确保在高并发环境下,数据的一致性和完整性不受影响。例如,使用`volatile`关键字保证变量在多线程环境下的可见性,使用`Atomic`类处理原子操作,或者使用`java....

    光阵高拍仪接口demo

    在光阵高拍仪接口demo中,开发者可以了解到高拍仪设备提供的各种API(应用程序编程接口),如启动拍摄、调整参数、获取图像数据等。这些接口使得开发者能够控制高拍仪执行特定操作。 2. 设备通信:了解如何通过USB...

    swoole聊天室demo.zip

    - "swoole":Swoole是一个为PHP设计的高性能、异步、事件驱动的网络通信框架,它可以扩展PHP处理TCP、UDP、HTTP等网络协议的能力,支持协程,适用于开发高并发的服务。 - "php":PHP是一种广泛使用的开源脚本语言,...

    Windows高性能并发IOCP之DELPHI实现DEMO

    开发者可以通过研究这个DEMO,深入了解DELPHI如何与Windows底层系统交互,以及如何构建高并发、高性能的服务端程序。同时,它还展示了如何集成常见的服务器功能,如数据库连接池和日志系统,对于提升服务端编程技能...

    Demo.AspNetCore2.EF6-master_DEMO_sentinel_

    5. **测试策略**: 由于涉及到"sentinel info for test",DEMO可能会包含模拟高并发、故障注入等测试用例,以验证Sentinel的保护机制是否有效。 6. **代码结构**: 解压后的项目可能包含Startup.cs文件,其中配置了...

    zxframe demo.rar

    zxframe主要用于有高访问量的项目,对高并发瓶颈有成套成熟解决方案,让你的服务稳健可用 *.支持读写分离,分库分表,读数据源熔断,数据源运行监控 *.支持JPA,既有hibernate的便捷操作,又有mybatis的sql集中编写...

    chat:C\C++语言利用epoll实现高并发聊天室Demo

    将聊天信息写到管道(pipe),并发送给父进程。 使用epoll机制接受服务端发来的信息,并显示给用户,使用户看到其他用户的聊天信息 运行效果 订阅客户端接受来自发布服务端的的内容示意图 运行环境 ubuntu 快速教程 ...

    Tornado实战Demo全集

    Tornado的异步非阻塞I/O模型使得它在处理高并发场景时表现出色。 1. **异步非阻塞I/O**:Tornado的核心特性之一就是其非阻塞的I/O模型,使用了Python的`asyncio`库。这意味着当一个请求正在等待I/O操作(如网络读写...

    明泰身份证读卡DEMO

    - **性能优化**:在高并发环境下,需要考虑读卡操作的并发控制,避免冲突和数据混乱。 总的来说,明泰身份证读卡DEMO为C#开发者提供了一个便捷的起点,帮助他们快速集成身份证读卡功能到自己的应用程序中。通过学习...

    iData扫描枪RFID串口开发DEMO

    5. **实时性优化**:由于RFID数据的快速读取特性,DEMO可能包含优化代码以处理高并发的数据流,保证数据的实时处理。 在具体开发过程中,开发者可以参考iData提供的DEMO进行二次开发,根据实际需求定制RFID模块的...

    moja(熔岩流)是一个跨平台,支持高并发,可集群部署的日志消息队列系统

    它以高性能、高并发为特点,允许在大规模分布式环境中进行集群部署,为企业的日志处理提供强大的支持。Moja主要服务于那些需要实时、高效地收集、存储和分析海量日志数据的场景,例如Web系统的性能监控、故障排查...

    AnyChat Demo

    3. **多用户并发**:AnyChat平台能够支持大规模并发用户,这意味着即使在高并发情况下,系统仍能保持稳定运行,为大量用户提供服务。通过分析Demo,我们可以了解其后台架构和用户管理策略。 4. **API接口**:开发者...

    STM32F407Demo

    STM32F407是一款高性能、低功耗的32位ARM Cortex-M4内核微控制器,由意法半导体(STMicroelectronics)生产。它广泛应用于工业控制、消费电子、医疗设备、通信系统等领域。 在这款Demo中,你可以找到以下关键知识点...

    JasonQt_Database Demo 支持多线程

    这在高并发场景下可能会成为性能瓶颈。为了解决这个问题,"JasonQt_Database Demo"进行了深入的优化,使得多个线程可以在不同的数据库连接上同时进行操作,从而提高了整体的并发能力。 在"JasonQt_Database"的实现...

    Android蓝牙连接设备demo

    这个"Android蓝牙连接设备demo"是一个学习和实践BLE通信的宝贵资源,它涵盖了从设备扫描、连接到数据传输的所有基本步骤,同时展示了如何处理多设备连接的挑战。开发者可以根据这个示例,结合自己的需求,构建出满足...

    linux下聊天的demo

    epoll是Linux内核提供的一种I/O多路复用技术,能够高效地处理大量并发连接,非常适合用于构建高并发的聊天服务器。 首先,我们来深入理解Linux套接字(socket)。套接字是进程间通信的一种方式,特别适合于不同主机...

Global site tag (gtag.js) - Google Analytics