社区
Java SE
帖子详情
多线程的同步问题
ghw
2001-05-10 09:34:00
有一个包含多个静态方法的类,在一个多线程的程序中,多个线程都有可能调用该类的某个静态方法。
能否保证同一时刻只有一个静态方法被调用,而且被调用的静态方法完成后,另一个调用静态方法的请求才能被响应?
...全文
144
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标准。本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和
同步
机制;然后讨论了一些高级话题,包括属性对象、线程私有数据和实时调度。此外,本书还讨论了调度的
问题
,并给出了避免错误和提高性能等
问题
的有价值的建议。本书使用了大量注释过后 实例来解释实际的概念,并包括Pthreads的简单索引和对标准化的展望。 《POSIX
多线程
程序设计》适合有经验的C语言程序员阅读,也适合
多线程
人员参考。
WPF
多线程
演示
WPF
多线程
演示
下载
多线程
编程技术开发资料 高清完整PDF版
多线程
编程技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权
问题
,请联系删除!
二、
多线程
同步
问题
一、线程安全
问题
比如同一个账户,加入父亲和儿子同时在不同的窗口同时取钱,比如剩余1000块,父亲取了800,儿子也取了800,不同窗口没有及时
同步
数据,可能就会实际支出了1600,而这是不允许发生的; - 这种不安全的
问题
并不是一定会发生,取决于线程的具体调度; - 但是一旦发生,就是灾难性的,必须在代码层面解决; 账户类 public class Account { private double balance; private String name; // set及get及有
【
多线程
】线程
同步
问题
的三种解决方法
目录一、前言二、
同步
代码块三、
同步
方法四、Lock方法五、总结 一、前言 解决线程
同步
问题
有三种方式:
同步
代码块、
同步
方法、锁(JDK5新增) 使用synchronized 解决线程
同步
问题
要时时刻刻注意要使用同一个
同步
监视器,特别是在继承创建
多线程
是要格外注意。 二、
同步
代码块 1、语法 synchronized(
同步
监视器){ 需要被
同步
的代码 } 2、对语法的说明 需要被
同步
的代码就是操作共享数据的代码
同步
监视器可以是任何类的对象,但必须是唯一的 实现创建
多线程
的案
Java SE
62,634
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章