2011-12-14 32 views
0

(我正在使用Java!)我有两个线程t1和t2。调用静态函数的两个线程 - 同步问题?

public static byte[] readSocket(DataInputStream dis, Logger log) throws IOException 
    { 
     byte[] byteArray = new byte[100]; 
     if(dis.read(byteArray, 0, 100)!=-1) 
     { 
      return byteArray; 
     } 
    } 

会有一个同步的问题,如果

  1. InputStream的是从不同的插座(即T1从上写着:每个线程通过调用公共静态功能如下从套接字的InputStream读取不同的插座和另一个t2)。
  2. 输入流对于线程t1和t2都是相同的。
+0

你最好猜的是什么? – 2011-12-14 12:28:22

+0

请显示*完整*方法 - 目前不会编译。 – 2011-12-14 12:28:41

+0

我猜这是某种功课?为什么不尝试并找出答案? – 2011-12-14 12:29:57

回答

2

它不会导致数据竞争。如果您在不同的线程上调用相同的方法,则每个线程在其自己的堆栈上都有不同的方法副本。因此,方法中的局部变量存在于每个线程的堆栈中,并且具有不同的副本。

因此,如果DataInputStream是外部参数共享与否,您唯一的问题就会出现。如果没有,那么你没有问题。该方法是静态的这一事实不会以任何方式影响我上面所说的。

0
  1. 没有,只要该方法不共享任何更高的比法范围的领域(其中byteArray实例?)
2

你的方法是完全无状态(在至少你给我们展示的部分),所以只要它的参数可以从多个线程使用,从不同线程调用它就可以了。

DataInputStream类的文件说:

DataInputStream所不为多线程访问

一定安全所以,如果两个线程使用不同的DataInputStream类的实例,你会没事的。如果他们使用同一个,那么你就会遇到问题:你需要自己同步访问流。

1
  1. 不,如果流来自不同的套接字,那么它是线程安全的。
  2. 是的。从javadoc

DataInputStream所引用不是多线程访问一定安全。线程安全是可选的,并且是本课程中用户的责任。