社区
Java SE
帖子详情
多线程的同步问题
ghw
2001-05-10 09:34:00
有一个包含多个静态方法的类,在一个多线程的程序中,多个线程都有可能调用该类的某个静态方法。
能否保证同一时刻只有一个静态方法被调用,而且被调用的静态方法完成后,另一个调用静态方法的请求才能被响应?
...全文
147
15
打赏
收藏
多线程的同步问题
有一个包含多个静态方法的类,在一个多线程的程序中,多个线程都有可能调用该类的某个静态方法。 能否保证同一时刻只有一个静态方法被调用,而且被调用的静态方法完成后,另一个调用静态方法的请求才能被响应?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ghw
2001-05-10
打赏
举报
回复
to lmy2000:
我知道你的意思了,谢谢。
呆会儿再给你加分,再看看其他人还有什么方法。
用flag来控制的方法我有这么一个思路,不知道对不对:
把flag放在静态类中,然后给静态类加一个用synchronized关键字同步的方法operate_flag(int flag_value,int mode),通过mode的设定来标志对flag的操作是set还是get,这样无论
是set还是get都能同步了。
lmy2000
2001-05-10
打赏
举报
回复
我想你弄错我的意思了,我并不是要用flag来控制,而是通过同步访问某一个方法(这里假设为test.getflag()这个方法)来控制。
这么说吧,在多线程类中,所有在访问test类的静态方法时,先要同步做一个访问某一个其他的方法的操作,通过这个瓶颈控制其他静态方法的访问。
不知说的是否清楚。
supersonics
2001-05-10
打赏
举报
回复
用volatile类型变量可以保证该变量只会任意时刻只被一个函数调用。
然后把该变量设为flag就可以了。
hello_wyq
2001-05-10
打赏
举报
回复
楼上的问的好!
ghw
2001-05-10
打赏
举报
回复
使用flag的方法我也想过,不过至少要两个方法setFlag()和getFlag(),这两个方法之间怎么同步呢?
lmy2000
2001-05-10
打赏
举报
回复
对不起,是synchronized,
他不仅可一锁定对象,还可以锁定某个动作。我想你可以在你的多线程访问各静态方法时加入一个同样的锁定动作的语句。如:
在你的多线程类中需要访问同步test类中的静态方法时,(不妨设有一个为getflag()方法):
synchronized(test.getflag()){ //凡是要访问到test类的静态方法时同步此动作
... //访问test类的静态方法。
}
看有否帮助。
ghw
2001-05-10
打赏
举报
回复
你说的是synchronized关键字吧,这种方法好像只能保证对一个静态方法的同步
lmy2000
2001-05-10
打赏
举报
回复
把你的方法加上同步关键字synchronous,不行吗?
ghw
2001-05-10
打赏
举报
回复
to lmy2000:
谢谢!只好下次给你分啦。
lmy2000
2001-05-10
打赏
举报
回复
很抱歉,你还是没有明白我的想法。
我并不是锁定具体的资源,其实我只是锁定了某个公用方法的执行:
class test{
public static void SyncMethod(){} //用来锁定的公用方法
public static void method1() { //只能同步访问的静态方法1
...
}
public static void method2() { //只能同步访问的静态方法2
...
}
...
}
public class abc {
public void methodA() {
//在访问前同步锁定(对每一个test中的静态方法同样,除SyncMethod()方法)
synchronized(test.SyncMethod()) {
test.method1();
} //在此释放方法的锁定
...
//在访问前同步锁定(对每一个test中的静态方法同样,除SyncMethod()方法)
synchronized(test.SyncMethod()) {
test.method2();
}
...
}
这样在class abc 中,对test类中的方法method1,method2只能一个个的访问,不管你有多少个线程同时执行。
ghw
2001-05-10
打赏
举报
回复
谢谢大家,给分!
needle
2001-05-10
打赏
举报
回复
^_^,笔误
ghw
2001-05-10
打赏
举报
回复
to needle:
非常感谢你的解答!
不过我觉得class abc 中设置flag的方法调用应该是syncObject.setFlag(true)吧,你怎么用syncObject(true)呢?
needle
2001-05-10
打赏
举报
回复
我这样想的,不知能不能达到你的要求
//abc.java
class SyncObject {
private static boolean flag = false;
public static void setFlag(boolean flag) {
this.flag = flag;
}
public static boolean getFlag() {
return flag
}
}
public class abc {
public static final SyncObject syncObject;
public static void methodA() {
//在方法头同步syncObject,检查
if(syncObject.getFlag()) {
synchronized(syncObject) {
syncObject.wait();
syncObject(true);
}
} else {
synchronized(syncObject) {
syncObject(true);
}
}
//在这里写你的方法内容
.....
synchronized(syncObject) {
syncObject.setFlag(false);
syncObject.notify();
}
}
}
ghw
2001-05-10
打赏
举报
回复
to lmy2000:
仔细一想上边你的说法有问题:getflag()方法获得某个资源之后,怎么把它释放?getflag()方法什么时候执行完毕?
supersonics(落叶狂风)的方法不错。
POSIX
多线程
程序设计.pdf
《POSIX
多线程
程序设计》深入描述了IEEE的开放系统接口标准——POSIX线程,通常称为Pthreads标准。本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和
同步
机制;然后讨论了一些高级话题,包括属性对象、...
WPF
多线程
演示
综上所述,WPF
多线程
演示项目可能涵盖了如何在WPF应用中正确使用
多线程
、避免阻塞UI、利用BackgroundWorker、Task Parallel Library或异步编程模型来实现后台任务,以及处理线程安全和异常等
问题
。这些知识点对于...
下载
多线程
编程技术开发资料 高清完整PDF版
死锁是
多线程
编程中经常遇到的一个
问题
,它指的是两个或多个线程互相等待对方释放锁,从而导致进程永远阻塞的情况。避免死锁需要程序员在设计程序时仔细规划锁的使用和线程间的交互。 8. 并发与并行 并发...
秒杀
多线程
第四篇 一个经典的
多线程
同步
问题
这个
问题
涉及到线程的
同步
和互斥,是一道非常有代表性的
多线程
同步
问题
,如果能将这个
问题
搞清楚,那么对
多线程
同步
也就打下了良好的基础。 程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数...
二、
多线程
同步
问题
一、线程安全
问题
比如同一个账户,加入父亲和儿子同时在不同的窗口同时取钱,比如剩余1000块,父亲取了800,儿子也取了800,不同窗口没有及时
同步
数据,可能就会实际支出了1600,而这是不允许发生的; - 这种不安全...
Java SE
62,634
社区成员
307,266
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章