同步带来的困饶

liujun3512159 2009-07-24 03:08:03
我在设想这样一个问题
如果只有一个对象,多线程调用这个对象的一个方法,会不会出现这个方法内的变量互相被覆盖的问题

public class Cs{

public moder(String mobel,String user){

String mob=mobel;
String u=user;

}

}

我的意思,如果有2个线程同时传递2组参数分别是(“111”,“us”),("222","en")

会不会出现这样极端的情况,正好第一个线程参数传递 “111”,后,准备传递“us”的时候
同时第2个线程也在做参数传递动作,正好把原来的“111”给覆盖掉了
这样变成传递参数(“222”,“us”)

也就是我所说的变量被互相覆盖。不知道会不会出现这样的问题?
...全文
197 20 打赏 收藏 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujun3512159 2009-08-13
  • 打赏
  • 举报
回复
大家继续讨论
cailiuge 2009-08-10
  • 打赏
  • 举报
回复
但是楼主写的程序好象跟自己描述的不一样啊.
public moder(String mobel,String user){

String mob=mobel;
String u=user;

}
同时调用的话不会出现你说的情况,因为mob和u是局部变量.不是类的成员变量,所以根本不可能覆盖.
cailiuge 2009-08-10
  • 打赏
  • 举报
回复
两个线程共用一个对象,注意是一个对象,肯定有可能出现覆盖了。
btq123 2009-08-10
  • 打赏
  • 举报
回复
局部變量怎麼會被覆蓋?
gerryliu 2009-08-07
  • 打赏
  • 举报
回复
方法中的变量是局部变量,不会被互相覆盖~
lz把多线程好好看看就很容易明白了
liujun3512159 2009-08-07
  • 打赏
  • 举报
回复
大家继续讨论
liujun3512159 2009-07-28
  • 打赏
  • 举报
回复
谢谢,我想,你说的应该很对
radeonxhl 2009-07-28
  • 打赏
  • 举报
回复
楼主的那种情况不会出现同步问题,但这样就会:

public class Cs{
String mob = null;

String u = null;

public moder(String mobel,String user){
mob=mobel;
u=user;
}
}

如果多个线程同时对同一个Cs对象操作的话,就会出现楼主所说的那种情况
liujun3512159 2009-07-28
  • 打赏
  • 举报
回复
针对这个类,如果在内存中只有一个对象实例,我想,多个线程调用这唯一的对象实例,应该会出现同步吧
冰思雨 2009-07-28
  • 打赏
  • 举报
回复
两个线程共用一个对象,它的信息当然会有被相互覆盖的可能。

一般,两个线程要是共用相同的对象,只是为了线程之间相互通信,或相互合作。

一般不会将对象的内容,覆盖来覆盖去滴,这样混乱的情况其实并没有什么好处。

还有,楼主要有面向对象的编程思想。
你的共享对象,主要是做数据载体,还是行为载体。
做数据载体,那么只完成相互通信,也就是,一个线程写入,其他线程只读不写。
做行为载体,那么只要完成线程间的相互合作,并且还要注意线程安全问题,以免数据产生不一致的现象。
三仙半 2009-07-28
  • 打赏
  • 举报
回复
顶一下10楼,按照10楼的说法,我做了一个实验,真的有同步问题,不过我不知道是不是正确理解了10楼的意思,请指正。

public class TestSynch implements Runnable {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 1000; i++) {
TestSynch ts1 = new TestSynch("us", "111");
TestSynch ts2 = new TestSynch("ch", "222");
new Thread(ts1).start();
new Thread(ts2).start();
}
}

public static cs c;

public String country;
public String code;

public TestSynch(String country, String code) {
c = new cs();
this.country = country;
this.code = code;
}

@Override
public void run() {
// TODO Auto-generated method stub
c.moder(country, code);
}

}

class cs {
String country = null;
String code = null;

public void moder(String country, String code) {
this.country = country;
for (int i = 0; i < 1000000; i++) {
}
;
this.code = code;
if ((this.country.equals("us") && this.code.equals("222"))
|| (this.country.equals("ch") && this.code.equals("111"))) {
System.out.println(this.country + "," + this.code);
}
}
}

wym2005em 2009-07-27
  • 打赏
  • 举报
回复
完全是两个对象,除非是static
humanity 2009-07-25
  • 打赏
  • 举报
回复
你有一点没有弄清楚,代码的执行都是执行在一个线程里的,而 Java 调用一个方法时,参数和方法内的局部变量都是放在线程对应的栈中的,而每个线程都有自己的栈,这就是楼上所说的没有共享变量。如果你是在这个方法中把传入的两个参数赋值给这个对象的两个属性的话,就有你所说的同步问题了。因为对象的属性这时可以因为不同的线程的方法同时在使用这个对象而导致冲突。局部变量肯定不会被其他线程同时使用。
tobeno2 2009-07-25
  • 打赏
  • 举报
回复
会有影响的,高流量下关键的地方要注意同步的问题。
blueyestar 2009-07-25
  • 打赏
  • 举报
回复
担心被覆盖的话就加个锁吧~  synchronized 方法 或 synchronized 块
爱摸鱼de老邪 2009-07-24
  • 打赏
  • 举报
回复
没有共享变量,不是同步
sangshusen_1988 2009-07-24
  • 打赏
  • 举报
回复
同时去操作一个全局变量的话,才有可能出来,你这样是出现不了线程
安全问题的
java91 2009-07-24
  • 打赏
  • 举报
回复
如果你这方法是一个静态方法,则需要同步控制,像你这样不同静态方法,则需要new一个对象,则不用同步。因为每个调用这个方法的类都是新对象,互不影响
flyxxxxx 2009-07-24
  • 打赏
  • 举报
回复
多线程只有在线程中去修改一个对象(这个对象同时又在其它的线程中用到了)的属性时才可能会出错。
你这个方法根本不存在修改Cs这个类的属性,所以不存在需要同步的问题

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧