package com.javase.threadsafe3; /** * 用关键字synchronized修饰实例方法 * 1.synchronized出现在实例方法上,锁的一定是this,没有选择,为此不灵活。 * 2.synchronized出现在实例方法上,表示整个方法都需要同步,可能会出现无故扩大同步范围,导致程序执行效率降低。 * 3.优点:代码写的少,简化了代码。如果共享的对象是this,并且需要同步的代码块是整个方法体,建议使用这种方式。 * * 总结:synchronized有三种用法: * 第一种:同步代码块 * 优点:灵活 * synchronized(线程共享对象){ * 同步代码块; * } * * 第二种:synchronized用在实例方法上 * 表示共享对象一定是this,并且同步代码块是整个方法体。 * * 第三种:在静态方法上使用synchronized * 这里的锁是类锁 创建了100个对象,这100个对象也只有一把类锁 * 对象锁: 创建了100个对象 就有100把对象锁。 */ public class Account { // 账户 private String act; // 余额 private double balance; // 构造方法(无参) public Account() { } // 构造方法(有参) public Account(String act, double balance) { this.act = act; this.balance = balance; } // set and get 方法 public String getAct() { return act; } public void setAct(String act) { this.act = act; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } // toString()方法 @Override public String toString() { return "Account{" + "act='" + act + '\'' + ", balance=" + balance + '}'; } // 取款方法(这里就是把synchronized 应用在实例方法上,这里锁的就是this) public synchronized void withdraw(double money){ // 获取取款前金额 double before = this.getBalance(); // 取款后金额 double after = before - money; // 更新余额 this.setBalance(after); } }
package com.javase.threadsafe3; public class AccountThread implements Runnable { //两个线程同享一个账户 private Account act; //构造方法(无参) public AccountThread() { } //构造方法(有参) public AccountThread(Account act) { this.act = act; } //重写run方法 @Override public void run() { //启动线程运行run()方法,就开始取款 //设定取款金额 double money = 5000; //调用取款方法 act.withdraw(money); //取款后输出提示信息 System.out.println(Thread.currentThread().getName() + "对账户:" + act.getAct() + "取款金额是:" + money + "账户余额是:" + act.getBalance()); } }
package com.javase.threadsafe3; public class Text { public static void main(String[] args) { //创建账户 Account account = new Account("111111",10000); //创建两个线程(共享同一个账户account) Thread thread1 = new Thread(new AccountThread(account)); Thread thread2 = new Thread(new AccountThread(account)); //启动线程 thread1.start(); thread2.start(); } }
/*
程序运行结果:
Thread-1对账户:111111取款金额是:5000.0账户余额是:5000.0
Thread-0对账户:111111取款金额是:5000.0账户余额是:0.0
*/
版权声明:本文为heliuerya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。