首页 > 编程语言 >java 解决线程安全的两种方式(Synchornized和Lock)

java 解决线程安全的两种方式(Synchornized和Lock)

时间:2023-08-01 18:55:23浏览次数:88  
标签:account java int Lock Synchornized lock new balance public

java 解决线程安全的两种方式(Synchornized和Lock)
原文链接:https://www.cnblogs.com/MrFugui/p/15610780.html

synchornized与lock的不同:

synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器

lock需要手动的启动同步(Lock()),同时结束同步也需要使用手动的实现(unlock())

synchornized方法实现线程同步方法:

public class ThreadBankTest {
    public static void main(String[] args) {
        Account account = new Account(0);
        Customer customer = new Customer(account);
        Customer customer2 = new Customer(account);
        customer.setName("甲");
        customer2.setName("乙");
        customer.start();
        customer2.start();
    }
}
class Customer extends Thread {
    private Account account;
    public Customer(Account account) {
        this.account = account;
    }
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            account.deposit(1000);
        }
    }
}
class Account {
    private int balance;
    public Account(int balance) {
        this.balance = balance;
    }
    //存钱
    public synchronized void deposit(int money) {
        if (money > 0) {
            balance += money;
            System.out.println(Thread.currentThread().getName()+"存钱成功"+balance);
        }
    }
}

Lock实现线程同步的方法:

public class ThreadBankTest2 {
    public static void main(String[] args) {
        Account2 account2 = new Account2(0);
        Customer2 customer = new Customer2(account2);
        Customer2 customer2 = new Customer2(account2);
        customer.setName("甲");
        customer2.setName("乙");
        customer.start();
        customer2.start();
    }
}
class Customer2 extends Thread {
    private Account2 account;
    public Customer2(Account2 account) {
        this.account = account;
    }
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            account.deposit(1000);
        }
    }
}
class Account2 {
    private int balance;
    //1.实例化ReentrantLock
    private ReentrantLock lock = new ReentrantLock();
    public Account2(int balance) {
        this.balance = balance;
    }
    //存钱
    public void deposit(int money) {
        try {
            //2.调用lock方法:要把要同步的代码放入到try中,try后面的代码就是要实现同步代码
            lock.lock();
            if (money > 0) {
                balance += money;
                System.out.println(Thread.currentThread().getName()+"存钱成功"+balance);
            }
        } finally {
            //3.给lock解锁unlock
            lock.unlock();
        }
    }
}

标签:account,java,int,Lock,Synchornized,lock,new,balance,public
From: https://www.cnblogs.com/sunny3158/p/17598796.html

相关文章

  • java 生成流水号 java流水号生成器 转载
    java生成流水号java流水号生成器转载原文链接:https://blog.51cto.com/u_16099315/6331544生成流水线单号格式:业务码+yyyyMMdd+数字例如:LSH2022102700001业务码+秒级时间戳+((userId+随机数)加密)JAVA生成编号工具类生成流水号(格式:业务码+时间+当天自增号)业务码+......
  • java自动生成流水号
    原文链接:http://www.bxcqd.com/news/495848.html......
  • Java之流水号生成器实现
    Java之流水号生成器实现原文链接:https://www.jianshu.com/p/331b872e9c8f开心一笑提出问题如何使用jAVA生成流水号,同时支持可配置和高并发???解决问题假设你们项目已经整合缓存技术假如你有一定的Java基础假如......下面的代码实现的是一个支持高并发,可配置,效率高的......
  • java打印日志时,如何对字段进行脱敏?
    java打印日志时,如何对字段进行脱敏?原文链接:https://blog.csdn.net/weixin_43901749/article/details/129150818第一步,创建类继承MessageConverter,重写convert方法,添加注解@Component("sensitive")第二步,在logback.xml中增加conversionRule标签在我们开发项目的时候,有些......
  • java日志脱敏(密码/身份证/其他自定义等)logback
    java日志脱敏(密码/身份证/其他自定义等)logback原文链接:https://blog.csdn.net/weixin_39286166/article/details/126889660一.脱敏规则类 importch.qos.logback.classic.pattern.MessageConverter;importch.qos.logback.classic.spi.ILoggingEvent;importorg.apache.c......
  • java中使用异步方式调用接口@Async
    @Async使用:1、首先在启动类上开启注解@EnableAsync2、然后需要异步操作的方法上加上@Async*/publicclassAsyncTest{@Asyncpublicvoidtest()throwsInterruptedException{//做处理Thread.sleep(1000);}/**如果需要返回值的话,通过AsyncResult进行封装*/@AsyncpublicF......
  • javascript按钮通过cookie限制60s后才可以点击
    javascript按钮通过cookie限制60s后才可以点击1️⃣首先创建一个html页面,放入一个按钮 2️⃣设置点击按钮的触发函数一般当点击按钮都会有一些业务需要,在需求结束后,触发saveCookie的方法 3️⃣saveCookie方法当点击查询按钮之后,触发saveCooike方法,按钮倒计时需要一个结束......
  • JavaIO流
    JavaIO流基础概念数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打......
  • 使用Java进行串口通信
    引言 由于java的平台无关特性使得串口编程很困难。因为串口需要一个与特定平台实现的标准的API,而这对于java来说很困难。不幸的是,Sun在java的串口通信上没有太多关注。Sun已经定义了一个叫做JavaComm的串口通信API,但它的实现却不是javaSE(标准版)的一部分。Sun只为少数java平台提......
  • 每个Java开发者都应该知道的5个JDK工具
    JDK是Java语言的软件开发工具包,没有它就无法编译Java程序。目前,有许许多多的JDK工具呈现在大家面前,但最常用的莫过于java.exe、javac.exe、jar等。除了这几个,还有哪些呢?本文作者Joe拥有多年的Java开发经验,其在博客上分享了一篇文章:5JDKToolsEveryJavaDeveloperShouldKnow,笔......