【好程序员特训营】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){

同步了这个方法,只允许一个线程进行访问,因而避免错误的出现

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

时间: 2024-10-29 19:09:40

【好程序员特训营】Java线程同步初探的相关文章

Java学习之StringBuffer <好程序员特训营>

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.StringBuffer是字符串缓冲区,是一个容器. 特点: 1)长度是可变化的. 2)可以字节操作多个数据类型. 3)最终会通过toString方法变成字符串. 2.StringBuffer的方法: 1)存储. StringBuffer append():

Java学习之多线程(sleep()和wait()的相同与不同点) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! sleep()和wait()的相同点: (1) 都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回 (2) 都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. sleep()和

Java学习之异常 &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象.其实就是java对不正常情况进行描述后的对象体现. 对于问题的划分:两种:一种是严重的问题,一种非严重的问题. a)对于严

Java学习之集合框架(2) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.Set接口 Set集合不允许重复元素,是因为Set判断两个对象相同不是使用==运算符,而是根据equals方法.即两个对象用equals方法比较返回true,Set就不能接受两个对象. public class SetDemo { public static

Java学习之多线程同步 &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 要求:用两个线程分别输出0到100之间的奇数和偶数,要求先输出10个奇数,再输出10个偶数,再输出10个奇数,以此类推 //Print类 public class Print { public void odd(int i){ System.out.printl

【好程序员特训营】Java类与对象

Java支持以下类与对象的概念: 多态.继承.封装.抽象.类.对象.实例.方法. 就像是书.也可以分为语文书.数学书.历史书什么的,每本书又有不同的内容. 一个简单的雇员的例子: Employee类有四个成员变量:name.age.designation和salary.该类显式声明了一个构造方法,该方法只有一个参数. public class Test { public static class Employee{ String name; int age; String design; dou

Java学习之集合框架(1) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 集合框架图: 1. Collection Collection定义了集合框架的共性功能. 1)添加  add(e);  addAll(collection); 2)删除  remove(e);  removeAll(collection);  clear();

Java学习之面向对象(封装、构造函数、this关键字) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:  (1)将变化隔离.  (2)便于使用.  (3)提高重用性.  (4)提高安全性. 原则:  (1)将不需要对外提供的内容都隐藏起来.  (2)把属性都隐藏,提供公共方法对其访问. 2.

Java基础小知识点 &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.在for循环中,如果增量是在for语句中定义,例如:  for(int i=0;i<3;i++)   那么,变量会在for循环执行完后被系统释放 2.break在循环中可以使用“标号”来确定跳出哪个循环,例如 w:for(int i=0;i<3;