想去阿里吃泡面 2022-03-30 22:07 采纳率: 95%
浏览 54
已结题

java synchronized(this)同步代码块括号里面的this为什么不能实现线程同步(具体问题在下面代码后面的粗体的注释)

package com.bjpowernode.java.threadsafe2;

public class Test {
public static void main(String[] args) {
Account act = new Account("act-001", 10000);
Thread t1 = new AccountThread(act);
Thread t2 = new AccountThread(act);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
class Account {
private String actno;
private double balance;
public Account() {
}
public Account(String actno, double balance) {
this.actno = actno;
this.balance = balance;
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void withdraw(double money) {
synchronized (this){//这里的this和下面(AccountThread线程类中同步代码块)的this有什么区别
double before = this.getBalance();
double after = before - money;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {**
e.printStackTrace();
}
this.setBalance(after);
}
}
}
class AccountThread extends Thread {
private Account act;
public AccountThread(Account act) {
this.act = act;
}
public void run(){
double money = 5000;
synchronized (this) {//这里的this为什么不能实现同步机制,
act.withdraw(money);
}
System.out.println(Thread.currentThread().getName() + "对"+act.getActno()+"取款"+money+"成功,余额" + act.getBalance());
}
}

  • 写回答

2条回答 默认 最新

  • Tomshidi 2022-03-30 22:19
    关注

    this代表的是当前实例对象,假设你有一百个线程,那每个AccountThread实例对象里的this都是新的。
    synchronized能锁住线程的前提是多个线程争抢同一个对象上的锁,你这this全都不同,锁了个寂寞,每个线程都自给自足,当然就全部同时执行了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 安装opengauss数据库报错
  • ¥15 【急】在线问答CNC雕刻机的电子电路与编程
  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas
  • ¥15 蓝牙硬件,可以用哪几种方法控制手机点击和滑动
  • ¥15 生物医学数据分析。基础课程就v经常唱课程舅成牛逼
  • ¥15 云环境云开发云函数对接微信商户中的分账功能
  • ¥15 空间转录组CRAD遇到问题
  • ¥20 materialstudio计算氢键脚本问题