线程同步锁

该博客讨论了Java中多线程环境下如何处理共享资源的问题。通过示例代码展示了如何使用`synchronized`关键字实现线程同步,防止数据不一致。主要涉及线程安全、同步锁的概念以及wait()和notify()方法的应用。
摘要由CSDN通过智能技术生成

package Thread;

public class Test2 {
public static void main(String[] args) {
//定义账户对象
Acount a = new Acount();

    //多线程对象
    User u_weixin = new User(a,2000);
    User u_zhifubao = new User(a,2000);
    Thread weixin = new Thread(u_weixin,"微信 ");
    Thread zhifubao = new Thread(u_zhifubao,"支付宝 ");

    weixin.start();
    zhifubao.start();
}

}
class Acount{
public static int money = 3000;

public synchronized  void drawing(int m){
    /**提款,判断账户钱够不够
     多线程调用这个方法,就有问题,线程共享资源时,一个线程在执行这个方法没有完毕时,另-一个线程又开始执行这个方法
     解决思路:显然一个线程整体执行完这个方法,另-个线程再执行
     通过synchronized同步锁来完成
     可以直接在方法.上加上synchronized 同步锁关键字
     *在普通方法.上加同步锁aynchronized,锁的是整个对象,不是某-个方法,不同对象就是不同的锁
     */
    String name = Thread.currentThread().getName();
    if (money < m){
        System.out.println(name+"操作"+"账号现有金额:"+money);
    }else{
        System.out.println(name+"操作"+"账号原有金额:"+money);
        System.out.println(name+"操作"+"取款金额:"+m);
        money=money-m;
        System.out.println(name+"操作"+"还剩余额:"+money);
    }
}

// public void drawing1(int m){
// synchronized(this){
// //表示当前的对象的代码块被加了sypchoniz加了同步
// //public void drawing1(int m,Acount a){
// // synchronized(a){表示通过方法的参数传递进来的对象的代码块被加了synchronized同步锁
// //不同的对象就有不同的同步锁
//
// /**提款,判断账户钱够不够
// 多线程调用这个方法,就有问题,线程共享资源时,一个线程在执行这个方法没有完毕时,另-一个线程又开始执行这个方法
// 解决思路:显然一个线程整体执行完这个方法,另-个线程再执行
// 通过synchronized同步锁来完成
// 可以直接在方法.上加上synchronized 同步锁关键字
// *在普通方法.上加同步锁aynchronized,锁的是整个对象,不是某-个方法,不同对象就是不同的锁
// * 普通方法加synchronized,线程使用不同的此方法的对象,还有共享资源的问题
// */
// String name = Thread.currentThread().getName();
// if (money < m){
// System.out.println(name+“操作”+“账号现有金额:”+money);
// }else {
// System.out.println(name + “操作” + “账号原有金额:” + money);
// System.out.println(name + “操作” + “取款金额:” + m);
// money = money - m;
// System.out.println(name + “操作” + “还剩余额:” + money);
// }
// }
// }
public void drwing3(int m , Acount a) throws Exception{
String name = Thread.currentThread().getName();
if (name.equals(“微信”)){
a.wait();//当前的线程进入等待的阻塞状态
}
if (money < m){
System.out.println(name+“操作”+“账号现有金额:”+money);
}else{
System.out.println(name+“操作”+“账号原有金额:”+money);
System.out.println(name+“操作”+“取款金额:”+m);
money=money-m;
System.out.println(name+“操作”+“还剩余额:”+money);
}
if (name.equals(“支付宝”)){
a.notify(); //唤醒当前优先级最高的线程,进入就绪状态
a.notifyAll();//唤醒当前所有的线程,进入就绪状态

    }

}

}

class User implements Runnable{
Acount acount;
int money;
public User(Acount acount,int money){
this.acount=acount;
this.money=money;
}
@Override
public void run() {
// acount.drwing3(money,);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值