把你的方法加上同步关键字synchronous,不行吗?
解决方案 »
- showinputdialog
- 请教一个关于a--的小问题
- 简述一下VeriftEvent和ModifyEvent事件的区别
- ClassPath很久的疑问
- 【在线等】MINA2.0 Iosession.setAttribute("name","value")疑问
- 请各位帮我看看到底错在哪里
- List变量的值为什么会转成 Customer 对象的值????
- 显示/隐藏ComboBox控件的滚动条提示
- 关于WIN98、2000、XP及2003的关机代码 在JAVA中写法一样吗?
- About rmi access builder
- 如何使JAVA程序为独立与开发环境的应用程序
- visual cafe哪里找?有多大?
他不仅可一锁定对象,还可以锁定某个动作。我想你可以在你的多线程访问各静态方法时加入一个同样的锁定动作的语句。如:
在你的多线程类中需要访问同步test类中的静态方法时,(不妨设有一个为getflag()方法):
synchronized(test.getflag()){ //凡是要访问到test类的静态方法时同步此动作
... //访问test类的静态方法。
}看有否帮助。
然后把该变量设为flag就可以了。
这么说吧,在多线程类中,所有在访问test类的静态方法时,先要同步做一个访问某一个其他的方法的操作,通过这个瓶颈控制其他静态方法的访问。
不知说的是否清楚。
我知道你的意思了,谢谢。
呆会儿再给你加分,再看看其他人还有什么方法。 用flag来控制的方法我有这么一个思路,不知道对不对:
把flag放在静态类中,然后给静态类加一个用synchronized关键字同步的方法operate_flag(int flag_value,int mode),通过mode的设定来标志对flag的操作是set还是get,这样无论
是set还是get都能同步了。
仔细一想上边你的说法有问题:getflag()方法获得某个资源之后,怎么把它释放?getflag()方法什么时候执行完毕? supersonics(落叶狂风)的方法不错。
//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();
}
}
}
非常感谢你的解答!
不过我觉得class abc 中设置flag的方法调用应该是syncObject.setFlag(true)吧,你怎么用syncObject(true)呢?
我并不是锁定具体的资源,其实我只是锁定了某个公用方法的执行: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只能一个个的访问,不管你有多少个线程同时执行。
谢谢!只好下次给你分啦。