日期:2014-05-20  浏览次数:20631 次

菜鸟求教synchronized 同步锁问题
服务器—客户机通讯问题

类Create 里有个方法,是个死循环,负责创建新的通讯线程
 客户机A连接成功,创建一个新线程,专门用于和A通讯
 客户机B连接成功,创建一个新线程,专门用于和B通讯

问题来了,
  服务器这边某个类有个变量x, 
  接收到客户机A数据a则在线程里进行x+=a操作;
  接收到客户机B数据b则在线程里进行x-=b操作;
服务器同时接收到A和B的数据a和b;
  
由于同时到达,而线程是独立的,所以同时对x进行操作,这显然出问题。
显然要用到同步锁,我是新手不会用,不知道要锁的对象是谁,
x是一个基本类型,显然不能锁x。求解啊,一下午看资料也搞不懂这个同步锁。
智力有限,求高手帮忙解决啊,越详细越好。

------解决方案--------------------
锁方法
synchronized void addX( int a){
x += a;
}

接收到客户机A数据a则在A线程里进行addX(a)操作;
接收到客户机B数据b则在B线程里进行addX(-b)操作;
------解决方案--------------------
如ls上所说,你只能给操作x的方法加上同步,这样效率会降低,但是也没别的办法。
------解决方案--------------------
你锁你操作x这个变量的类方法啊;或者锁你操作x这个那个对象。
对了,如果用后者,那这个操作x变量的这个对象,在服务器必需只有一个,或都你把那个对象声明成static !
------解决方案--------------------
你只能给操作x的方法加上同步,这样效率会降低,但是也没别的办法
------解决方案--------------------
只有一个变量 volatile不行吗
------解决方案--------------------
synchronized void addX( int a){
x += a;
}


------解决方案--------------------
探讨
服务器—客户机通讯问题

类Create 里有个方法,是个死循环,负责创建新的通讯线程
客户机A连接成功,创建一个新线程,专门用于和A通讯
客户机B连接成功,创建一个新线程,专门用于和B通讯

问题来了,
服务器这边某个类有个变量x,
接收到客户机A数据a则在线程里进行x+=a操作;
接收到客户机B数据b则在线程里进行x-=b操作;
服务器同时接收到A和B的数……

------解决方案--------------------
把X设为成员变量。
synchronized void setCount( int y){
x += y;
}
当A连接上传y=+a ;
当B连接上传y=-b;

------解决方案--------------------
探讨
引用:

引用:
服务器—客户机通讯问题

类Create 里有个方法,是个死循环,负责创建新的通讯线程
客户机A连接成功,创建一个新线程,专门用于和A通讯
客户机B连接成功,创建一个新线程,专门用于和B通讯

问题来了,
服务器这边某个类有个变量x,
接收到客户机A数据a则在线程里进行x+=a操作;
接收到……

------解决方案--------------------
探讨

那你可以试验一下 你看看在原始类型上如何搞出因为你没加独占锁出现的计算错误 很难的哦~