多个线程 - 对类成员变量的独占访问?

时间:2012-01-21 01:43:15

标签: java synchronization

我有一个存储多个字符串和整数的类。我的程序不断更新这些值。

在同一个程序中,我还有一个简单的套接字服务器,它处理对我的类对象中包含的数据的传入请求。因为服务器代码包含while(true)循环,所以我假设我需要将代码放在一个单独的线程中。否则一旦我进入这个循环,其他任何东西都不会执行?然后,我将对我的类的引用传递给服务器线程,以便可以获得值。

static ServerSocket socket1;
static Socket connection;

while (true) {
    connection = socket1.accept();
    ...
 }

无论如何,我想知道如果我要创建一个单独的服务器线程,那么我可能会遇到同步问题。当我的程序中满足某个条件时,类的成员会更新。如果服务器当前正在更新,我不希望服务器能够读取这些值。我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

您可以实现runnable接口并在run()方法中编写循环。

public class SocketClass implements Runnable {
  // variables

  // running the thread
  public void run() {
    while(true) {
      // loop
    }
  }
}

在主线程中,您可以使用new Thread(...).start()开始一个新线程。

SocketClass socket = new socketClass();
new Thread(socket).start();

然后您可以访问您的SocketClass,您可以在其中访问变量。在读取或更新数据时,您应该在类或您正在使用的对象上进行同步。

// in main thread
synchronized(socket) {
  // read data
}

// in SocketClass
synchronized(this) {
  // write data
}