文章目录hello 大家好,相信有很多学习java的小伙伴和以及工作的朋友们,本文呢主要讲多线程中关于异步和同步相关内容,剩余的部分内容回尽快更新哈
- 前言
- 一、什么是异步?
- 二,什么是同步?
- 三,synchronized的使用
- 总结
前言
虽然说在实际工作当中,我们可能编写关于多线程的代码比较少,但是我们一定会是在一个多线程的环境下去研发,所以也就体现出了多线程的重要性,而且像大厂的面试也会经常问到,所以多线程一定是一门必修课。
以下是本篇文章正文内容,下面案例可供参考
一、什么是异步?在多线程环境中,没有讲到synchronized之前我们的程序其实都是异步的,我们两个线程在同时作业是相互不影响的,这样效率会比较高,但线程不安全。
二,什么是同步?打个比方,我们现在要进行一个取款操作,现在有t1和t2两条线程,两条线程分别对同一个账户进行取款1000元,账户余额也只有1000元代码,在我们第一条线程执行到if的时候是符合取款条件的,我们都知道JAVA是对多线程环境是抢占式的,所以有没有可能,在还没来得及进行取款操作时,CPU时间片到期了,这个时候第二条线程到了if语句块,因为第一条线程还没来得及对数据进行更新导致了第二条线程也进来了,明明余额不符合进行两次取款操作但还是进行了,所以在异步环境下会产生数据不安全的问题。而同步解决了线程不安全问题,但是效率会降低。示例:
//余额为1000
user.setamount = 1000.0;
//我们要取走的金额
double amount = 1000.0;
//判断余额是否大于我们需要取走的金额
if(user.getamount>=amount){
//进入到这里说明符合取款条件
//进行更新数据
user.setamount (amount);
}
三,synchronized的使用
synchronized这个方法需要将所需要同步的对象作为参数填入,关于它的实现原理也非常简单,每个对象事实上是有一把锁的,可以理解为唯一标记,我们的第一条线程在运行到synchronized后首先会将该对象的对象锁进行收缴,而第二条线程也运行到了synchronized但是因为第一条线程并没有将synchronized同步代码块运行完毕,所以二条线程只能等着,只有当第一条线程运行完同步代码块后将对象锁归还synchronized,那么第二条线程才可以收缴锁去运行程序代码块。
根据以上信息我们可以总结出什么时候使用synchronized:
1.多线程的环境下;
2.多条线程操作同一个资源或者是对象;
3.是修改操作;
public class Bank {
//用户名
private String account;
//余额
private double balance;
public Bank() {
}
public Bank(String account, double balance) {
this.account = account;
this.balance = balance;
}
public void setAccount(String account) {
this.account = account;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getAccount() {
return account;
}
public double getBalance() {
return balance;
}
//创建取款方法
public void deleteByAKM(double deleteBalance) {
//保证线程同步
synchronized (this) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
double after = balance - deleteBalance;
this.setBalance(after);
}
}
}
public class Thread06 {
public static void main(String[] args) throws Exception{
Bank rank = new Bank("user_001",7000.0);
Thread ATM1 = new Thread(new ThreadTest06(rank));
Thread ATM2 = new Thread(new ThreadTest06(rank));
ATM1.start();
ATM2.start();
}
}
public class ThreadTest06 implements Runnable{
private Bank bank;
public ThreadTest06(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"取款前"+",剩余余额:"+bank.getBalance());
bank.deleteByAKM(1000.0);
System.out.println(Thread.currentThread().getName()+"取款1000.0元成功!"+",剩余余额:"+bank.getBalance());
}
}
总结
这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了同步和异步理解以及synchronized的使用。



