ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java多线程(五)-线程同步(同步方法)

2021-10-02 17:03:59  阅读:126  来源: 互联网

标签:account 同步 synchronized get money Account 线程 now 多线程


六.线程同步(并发)

1.synchronized方法

控制对对象的访问,每个对象都有一把锁,每个synchronized方法都必须获得调用该方法的锁才能执行,方法一旦执行,就独享该锁,使用完该对象后释放锁,其他线程才能获得锁,继续执行。

public synchronized void method(){}

 

2.synchronized块

synchronized (obj){}

obj可以是任何对象,称为同步监视器,推荐使用共享资源作为同步监视器,synchronized方法无需指定同步监视器,因为其就是this。

执行过程:1.第一个线程访问,锁定同步监视器,执行内容 2.第二个线程访问,同步监视器被锁,无法访问,等待第一个线程解锁同步监视器然后访问。

点击查看案例
public class Unsafe2 {
    public static void main(String[] args) {
        Account account = new Account(200,"home");
        // 创建家庭账户一共有200w
        GetMoney boy = new GetMoney(account,200,"boy");
        GetMoney girl = new GetMoney(account,50,"girl");
        boy.start();
        girl.start();
    }
}

class Account{

    int money;
    String id;

    public Account(int money, String id) {
        this.money = money;
        this.id = id;
    }
}

class GetMoney extends Thread{

    Account account;
    int get;
    // 取了多少
    int now;
    // 现余多少

    public GetMoney(Account account, int get,String name) {
        super(name);
        this.account = account;
        this.get = get;
    }

    @Override
    public void run() {
        
        synchronized (account){
            if (account.money - get < 0){
                System.out.println(Thread.currentThread().getName()+":money is not enough");
                return;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            account.money = account.money - get;
            now = now + get;
            System.out.println(account.id+"-account-money:"+account.money);
            System.out.println(Thread.currentThread().getName()+"-now:"+now);
        }
    }
}
运行结果
home-account-money:0
boy-now:200
girl:money is not enough

 

标签:account,同步,synchronized,get,money,Account,线程,now,多线程
来源: https://www.cnblogs.com/tao-gak567/p/15362179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有