Java高并发——使用Lock锁实现并发安全

前言

并发,在一个成熟的系统中是必不可少的,这也是广大程序猿探讨的热点,高并发下的数据安全尤为重要。博主最近也在巩固这方面的知识,特此整理一下博客,做一下记录。

什么是并发?并发有哪些问题?

提到并发,就不得不提到线程,关于多线程想必大家都知道,如果一个程序开启多个线程,执行多个任务,那么我们就说这个程序存在并发。

并发场景下,最需要注意的问题就是数据安全性,即线程安全,那么什么是线程安全呢?

现在我们模拟一下银行转账的过程,假设要给转入账户增加金额:

第一步,读取转入账户的余额

第二步,增加转入的钱

第三步,将新的余额存入

如果两个线程同时在操作这一个账户,也就是说两个人同时向同一个账户转账的情况下,可能线程1执行完了第一步和第二步,但是还没有执行第三步的时候失去了CPU资源,然后线程2获得了运行权并且修改了转入账户的钱,然后线程1又被唤起,继续执行第三步……这样一来,总金额肯定是不正确的,压根儿就不是一个原子操作。

所以,这时候我们就需要采用锁机制来保证同步,即某些操作只允许一个线程操作,不允许多个线程同时进行的情况出现。

没有锁的并发实例

现在,我们用代码模拟银行转账的过程,假设一个银行有100个账户,每个账户有1000元的金额,创建多个线程随机转账,那么理想的情况下,银行的总金额应该是100x1000=100000元,以下是不加锁的情况:

银行业务类——Bank.java

package com.shuixian.jianghao.utils;

import java.text.DecimalFormat;
import java.util.Arrays;


/**
 *  银行业务类
 * @author 秋枫艳梦
 * @date 2019-05-07
 * */
public class Bank {
    //账户数组
    private final double[] accounts;

    private DecimalFormat decimalFormat = new DecimalFormat("#.00");

    /**
     *  构造函数
     * @param n accounts数组的长度
     * @param initialBalance 每个账户的钱款数
     * */
    public Bank(in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值