爪哇线程同步是保证多线程状态下安全访问竞争资源的一种编程手段,但线程的同步在爪哇多线程编程中算是一个比较难的难点,很多开发者甚至都不知道什么是竞争资源,也不知道时候需要进行线程同步,当然这是没有明确答案的,一些原则问题还是要考虑。
Java如何实现线程同步?
对于同步,在具体的爪哇代码中需要完成一下两个操作:
1、把竞争访问的资源标识为私人;
2、同步哪些修改变量的代码,使用同步的关键字同步方法或代码。
当然这不是唯一控制并发安全的途径。
同步的关键字使用说明
同步的只能标记非抽象的方法,不能标识成员变量。
为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100瓦,然后模拟透支、存款等多个操作。显然银行账户用户对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。
01/**
02* Java线程:线程的同步
03*
04 * @作者雷志民2009-11-4 11:23:32
05*/
06公共类测试{
07公共静态void main(String[]参数){ 0
08用户u=新用户('张三', 100);
09MyThread t1=new MyThread('线程a ',u,20);
10MyThread t2=新的MyThread('线程b ',u,-60);
11兆字节读取t3=新的MyThread('线程c ',u,-80);
12MyThread t4=新的MyThread('线程d ',u,-30);
13MyThread t5=新的MyThread('线程e ',u,32);
14MyThread t6=new MyThread('线程f ',u,21);
15t 1。start();
16t 2。start();
17t 3。start();
18t 4。start();
19t 5。start();
20t 6。start();
21}
22}
23类MyThread扩展线程{
24个私人用户;
25 private int y=0;
26字节读取(字符串名称,用户单位,整数)
27super(名称);
28this.u=u
29this.y=y
30}
31公共无效运行(){ 0
32u。oper(y);
33}
34}
35类用户{
36私有字符串代码;
37私人国际现金;
38用户(字符串代码,整数现金){ 0
39this.code=code
40 .现金=现金;
41}
42公共字符串GetCode(){ 0
43返回码;
44}
45public void setCode(字符串代码){ 0
46this.code=code
47}
48/**
49* 业务方法
50* @param x添加x万元
51*/
52公共同步无效操作(int x){ 0
53英里
54线。睡眠(10L);
55这个。现金=x;
56系统。出去。println(线程。currentthread().' getName()'运行结束,增加“‘x’,当前用户账户余额为:'现金;
57线。睡眠(10L);
58}捕获(中断例外){ e
59e。print stack trace();
60}
61}
62 @覆盖
63公共字符串ToString(){ 0
64返回"用户{"
65 '代码='代码' '
66 ',现金='现金'
67'}';
68}
69}
复制代码
/**
* Java线程:线程的同步
*
* @作者雷志民2009-11-4 11:23:32
*/
公共类测试{
公共静态void main(String[]参数){ 0
用户u=新用户('张三', 100);
MyThread t1=新的MyThread('线程a ',u,20);
MyThread t2=新的MyThread('线程b ',u,-60);
MyThread t3=新的MyThread('线程c ',u,-80);
MyThread t4=新的MyThread('线程d ',u,-30);
MyThread t5=新的MyThread('线程e ',u,32);
MyThread t6=新的MyThread('线程f ',u,21);
t1。start();
T2。start();
T3。start();
T4。start();
t5。start();
T6。start();
}
}
类MyThread扩展了线程{ 0
私人用户u;
private int y=0;
MyThread(字符串名称,用户单位,整数)
超级(名称);
this.u=u
this.y=y
}
公共void run(){ 0
u。oper(y);
}
}
类别用户{
私有字符串代码;
私人国际现金;
用户(字符串代码,整数现金){ 0
this.code=代码
这个,现金=现金;
}
公共字符串GetCode(){ 0
返回代码;
}
公共void setCode(字符串代码){ 0
this.code=代码
}
/**
* 业务方法
* @param x添加x万元
*/
公共同步void oper(int x){ 0
尝试{
线。睡眠(10L);
这个。现金=x;
系统。出去。println(线程。currentthread().' getName()'运行结束,增加“‘x’,当前用户账户余额为:'现金;
线。睡眠(10L);
} catch(中断异常){ e
e。print stack trace();
}
}
@覆盖
公共字符串ToString(){ 0
返回"用户{"
代码='代码' ' '
,现金='现金
'}';
}
}