最近在写多线程的东东~~
突然感觉  有几个疑点,想了半天还是很晕,所以像大家请教1、如果一个进程内运行一系列相关的线程A、B、C、....,如何得知currentThread()获取当前线程引用是哪个线程的引用?2、线程A中某一值int ss是通过线程B远程调用(通过RMI)线程A的setSS()方法更改的,我现在比较晕的是:这个值ss在B中更改,而A中的执行时是需要判断这个ss的值的,这里ss值的set和get是否涉及到同步问题?需要加锁吗? 3、在应用RMI的时候:建立一个线程A,在其中启动RMI注册,注册时需要new一个继承自UnicastRemoteObject的实现remote接口的类,比如
public class RemoteMethodImpl extends UnicastRemoteObject implements RemoteMethod{
public RemoteMethodImpl(){
}
//这里面有一个方法要引用当前运行的线程A
public void setXX(int i){
A aa;//疑问在这:如何取得当前运行的线程A的引用?
aa.setWeight(i);
}
}

解决方案 »

  1.   

    1、对于这个问题你查一下线程API的帮助,可以通过Thread.currentThread().getThreadGroup().getParent()方法获得当前线程的父线程,线程和线程组是个比较复杂的东西,要仔细看API帮助。
    2、这里不需要同步处理,还有方法不会属于某个线程,只有某个线程对方法的调用,最后的值是存放在对象或者类中,对象和类也不属于线程,不过我看你的业务,A线程判断值,而B线程设置值,我仅看这个业务逻辑是不需要同步的,因为A线程判断的就是B线程改变的值,这里没必要同步。
    3、这个你也可以查看API帮助,我记得Theard类中有个currentThread()的静态方法来获得当前运行线程。
      

  2.   

    其他两项同上。
    就说2.关于多线程访问数据产生数据竞争问题,你要关心的不是A的变量值在B中更改,而是根据你程序的逻辑判断首先不要产生数据值的歧义引起逻辑错误,即A中的变量修改是在逻辑上不被允许的情况向被B修改。(如这个数据是账户余额)。另外如果有多个B的实例的话为了保证数据完整性还是上个锁好些。
      

  3.   

    to spiniper & lemonandznn
     关于第一个及第三个·~~调用currentThread之后返回的是Thread  而我又要使用到原先那个线程中的方法啊·~~~那个线程组本身是个线程么?没用过那玩意·~~进行线程管理不知效果如何~~~
    我现在都是把线程塞到list管理~~~第二个·~~其实我是相当于把get和set方法写到两边了~~异步调用~~~但是又是同一个变量的值,这个应该用不到锁吧~~~现在还是很晕
      

  4.   

    我说过,方法不属于线程,线程只是调用方法,无论你有多少线程,调用的只有一个方法。
    用锁是个很谨慎的事情,如果用到锁,那你就要精确的确认锁的范围和时机,胡乱加锁会导致系统运行变慢,锁也会导致程序出现死锁或者不可预知的一些逻辑错误,而且错误很难查找出来,锁机制可以说是对系统性能影响最大的方式之一,因为系统需要消耗资源维护锁的相关资源,而且锁是一个将多线程编程串行队列的方式执行的机制,开发程序有个不成文的规定,能不用多线程就不用多线程,用了多线程能不用锁就不用锁。
    仅仅是get和set调用,是不用锁的,你要分析业务中是否存在数据脏读的情况,而且这个情况出现在哪,哪个地方加锁,不要盲目的给get和set方法加锁。
      

  5.   

    to spiniper
    嘿嘿·~谢谢  现在多线程是不可避免咯·~~应该不会出太大问题·~~现在还在调试中~~