【好程序员特训营】Java线程同步初探

对于同步,在具体的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){
同步了这个方法,只允许一个线程进行访问,因而避免错误的出现

【好程序员特训营】Java线程同步初探_第1张图片

代码已经验证过了,能够实现功能

你可能感兴趣的:(java,线程,同步)