对于同步,在具体的Java代码中需要完成以下两个操作:
把竞争访问的资源标识为private;
同步那些修改变量的代码,使用synchronized关键字同步方法火代码。
synchronized关键字智能标记费抽象方法,不能标记成员变量
为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支、存款等多个操作。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。
以下是代码:
public class Test { public static void main(String args[]){ User u=new User("张三",100); MyThread t1=new MyThread("线程A",u,20); MyThread t2=new MyThread("线程B",u,20); MyThread t3=new MyThread("线程C",u,20); MyThread t4=new MyThread("线程D",u,20); MyThread t5=new MyThread("线程E",u,20); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } static class MyThread extends Thread{ private User u; private int y=0; MyThread (String name,User u,int y){ super(name); this.u=u; this.y=y; } public void run(){ u.oper(y); } } static class User{ private String code; private int cash; User (String code,int cash){ this.code=code; this.cash=cash; } public String getCode(){ return code; } public void setCode(String code){ this.code=code; } public synchronized void oper(int x){ try{ Thread.sleep(10L); this.cash+=x; System.out.println(Thread.currentThread().getName()+"运行结束,增加“" +x+"“,当前账户余额为:"+cash); }catch(InterruptedException e){ e.printStackTrace(); } } public String toString(){ return "User{"+"code="+code+",cash="+cash+"}"; } } }
public synchronized void oper(int x){同步了这个方法,只允许一个线程进行访问,因而避免错误的出现
代码已经验证过了,能够实现功能