已经是同步操作.
你在A中已经用synchronized限制对sa的操作:同步操作。
你在A中已经用synchronized限制对sa的操作:同步操作。
解决方案 »
- 如何把method.invoke后的返回值转成数组或集合类型?
- SERVLET在数据库中处理的结果,怎样在传给JSP?
- JAVA能拦包吗??就是类似于自动外挂挂机的那种.急急!!!!!!!
- 关于APPLET弹出窗口的问题!
- 我用DefaultMutableTreeNode建立jtree的节点,但空的目录显示为小圆点,如何才能显示为目录呢?
- 关于文件操作的,问题,谢谢大家关注
- 如何创建一个public static final 类型的map 并能赋初值
- 请问解析一个XML文件的时候,如何获得结点的属性信息?
- 既简单又复杂的问题!带通配符的两个字符串的比较!!!
- 接口的意思是?多謝。
- jbuilder中加载SmartUpload.jar的问题。。。
- 哪个网站的JDK下载速度较快
例如:
public class A{
private String [] sa=new String[10];
//或使用private static String [] sa=new String[10];
public A(){
//init sa
} public synchronized void setStringArray(String aa,int num)
throws Exception{
sa[num]=aa;
} } public class B implements Runnable{
private A a;
public B(A aa){
a=aa;
}
public void run(){
while(flag){
try{
a.setStringArray("12345",3);
}catch(Exception e){}
}
}
} public class C implements Runnable{
private A a;
public C(A aa){
a=aa;
}
public void run(){
while(flag){
try{
a.setStringArray("assgff",3);
}catch(Exception e){}
} }
}
B与C中的aa指向同一地址。
同步操作
//或使用private static String [] sa=new String[10];
那么sa在各个实例中是指向同一个对象的。
static是class范围的。
B与C调用此方法时只是对自己的A实例加了锁
所以我认为他们是不同步的,不知各位高手有没有其他意见?
但是在调用A中方法是对同一个class范围的数组操作
同步问题不在对象A上,在sa这个数组上
所以我认为较好的写法是:
private static String [] sa=new String[10]; public void setStringArray(String aa,int num)
throws Exception{
try {
synchronized (sa) {
sa[num]=aa;
}
} catch (InterruptedException e) {
/* do something */
}}