问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简单写出线程同步的方法(java)

发布网友 发布时间:2022-05-25 16:45

我来回答

1个回答

热心网友 时间:2023-11-20 08:06

/**
* Java线程:线程的同步
*
* @author leimin 2009-11-4 11:23:32
*/
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, -60);
MyThread t3 = new MyThread("线程C", u, -80);
MyThread t4 = new MyThread("线程D", u, -30);
MyThread t5 = new MyThread("线程E", u, 32);
MyThread t6 = new MyThread("线程F", u, 21);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
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);
}
}
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;
}
/**
* 业务方法
* @param x 添加x万元
*/
public synchronized void oper(int x) {
try {
Thread.sleep(10L);
this.cash += x;
System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);
Thread.sleep(10L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "User{" +
"code='" + code + '\'' +
", cash=" + cash + '}';
}
}
输出结果:线程A运行结束,增加“20”,当前用户账户余额为:120

线程F运行结束,增加"21",当前用户账户余额为:141
线程E运行结束,增加"32",当前用户账户余额为:173
线程C运行结束,增加"-80",当前用户账户余额为:93
线程B运行结束,增加"-60",当前用户账户余额为:33
线程D运行结束,增加"-30",当前用户账户余额为:3

Process finished with exit code 0反面教材,不同步的情况,也就是去掉oper(int x)方法的synchronized修饰符,然后运行程序,结果如下:线程A运行结束,增加"20",当前用户账户余额为:61

线程D运行结束,增加"-30",当前用户账户余额为:63
线程B运行结束,增加"-60",当前用户账户余额为:3
线程F运行结束,增加"21",当前用户账户余额为:61
线程E运行结束,增加"32",当前用户账户余额为:93
线程C运行结束,增加"-80",当前用户账户余额为:61

Process finished with exit code 0很显然,上面的结果是错误的,导致错误的原因是多个线程并发访问了竞争资源u,并对u的属性做了改动。可见同步的重要性。注意:通过前文可知,线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还可以使用特定的方法对线程进行调度。这些方法来自于java.lang.Object类。

void notify()
唤醒在此对象监视器上等待的单个线程。
void notifyAll()
唤醒在此对象监视器上等待的所有线程。
void wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
void wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 火锅餐厅厨房有哪些 小火锅厨房设备有哪些 java线程同步几种方式 法拍商业房做房产证需要什么手续 拍卖房子过户时要提供什么资料呢 怀孕了可以吃羊肉吗初期 在职研究生专业及考试时间 全国2016年在职研究生考试时间是什么时候 如果只知道双曲线焦点与准线距离,如何求方程 双曲线的过焦点的弦长到准线 双曲线中两个焦点到同一条准线的距离是否相等? 怎么求双曲线的焦点到准线的距离? 双曲线焦点到准线的距离,跟实轴和虚轴之间有什么关系?求图双曲线的准线在哪个位置 个人想代理股票开户业务,不知道要具备什么条件?哪几个公司是可以代理的? 双曲线上的点到准线的距离求解问题 双曲线准线公式 双曲线 的右焦点到右准线的距离为___. 证券基金个人可以代理销售吗? 双曲线中焦点到准线的距离怎么算? 个人可以做证券代理业务吗,赚佣金 双曲线焦点到准线的距离 我想在县城代理、股票开户生意,我个人也在做,需要啥资格才可以办理呀 如何使用java synchronized进行线程同步 海尔全自动洗衣机显示001是什么意思 海尔统帅滚筒洗衣机001是什么故障 海尔洗衣机滴滴叫是什么故障01 适合梨形身材穿衣搭配 租房子的时候,大房间好还是小房间好?为什么 住小房间好还是住大房间好 两家人住大房子好,还是两家人各住小房子好? 如何将SWF的Flash转换成视频格式?? 重庆哪里有手工活发放带回家做的- 问一问 艾灸脚底后老放屁好不好 有手工活吗?拿回家做 感觉胀气很厉害,之前做艾灸,师傅就说肚子有点涨,做了一次暖宫,那天放了好多屁,然后就没时间去了, 有没有手工活可以带回家干的 有可以带回家干的手工活吗 有什么可以带回家干的手工活吗 海阳哪里有手工活可带回家做的 邵阳有哪些手工活可以带回家做的 打嗝或者醒鼻涕的时候,耳朵有嗡嗡的响声,正常吗 现在靖江陈士荣蟹黄汤包每笼的价格?