当前位置: 技术问答>java相关
线程中的同步问题!
来源: 互联网 发布时间:2015-04-13
本文导语: 我的问题是这样的: 假设有两个线程B,C同时对一个类A中数据操作如下所示: example: public class A{ private String [] sa=new String[10]; //或使用private static String [] sa=new String[10]; public A(){ //init sa } public synchron...
我的问题是这样的:
假设有两个线程B,C同时对一个类A中数据操作如下所示:
example:
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=new A();
public void run(){
while(flag){
try{
a.setStringArray("12345",3);
}catch(Exception e){}
}
}
}
public class C implements Runnable{
private A a=new A();
public void run(){
while(flag){
try{
a.setStringArray("assgff",3);
}catch(Exception e){}
}
}
}
各位高手,线程B与C有没有进行同步处理
假设有两个线程B,C同时对一个类A中数据操作如下所示:
example:
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=new A();
public void run(){
while(flag){
try{
a.setStringArray("12345",3);
}catch(Exception e){}
}
}
}
public class C implements Runnable{
private A a=new A();
public void run(){
while(flag){
try{
a.setStringArray("assgff",3);
}catch(Exception e){}
}
}
}
各位高手,线程B与C有没有进行同步处理
|
ddtqfly() ,你不是已经明白了么?B,C是两个类怎么同步?再说了,B,C也没有出现资源共享的问题呀。
|
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 */
}
}
但是在调用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 */
}
}
|
“当B与C调用此方法时只是对自己的A实例加了锁”就是这样啊,B、C互不干扰。如果用static就不一样了,这时候会有同步问题。
|
支持ddtqfly() ,B和C中的实例是两个不同的实例,应该没有同步问题,