【发布时间】:2011-03-02 01:46:54
【问题描述】:
我将如何在客户端-服务器应用程序中执行此操作?
我想基本上让客户端通过单独的线程访问相同的数据,并且我想避免并发线程问题,所以我要求示例。
【问题讨论】:
-
你能详细说明你想要做什么吗?在客户端-服务器应用程序中使用不同线程的相同数据有点模糊。
标签: java multithreading sockets network-programming client-server
我将如何在客户端-服务器应用程序中执行此操作?
我想基本上让客户端通过单独的线程访问相同的数据,并且我想避免并发线程问题,所以我要求示例。
【问题讨论】:
标签: java multithreading sockets network-programming client-server
要访问相同的数据,您只需要确保访问的是同一个类实例。所以两个线程碰到同一个单例,或者从某个工厂获得的同一个对象都将获得相同的数据。显然,具体情况取决于您的应用程序。
并发问题通常只会在修改某些数据时出现。例如,假设您有以下课程:
class Container {
private List<?> data;
public List<?> getData() {
return this.data;
}
public void addData(Object data) {
this.data.add(data);
}
}
那么这不一定是线程安全的。为了使其线程安全,您需要锁定对象监视器。在这种情况下,这可以通过以下两种方式之一完成:
class Container {
private List<?> data;
public synchronized List<?> getData() {
return this.data;
}
public synchronized void addData(Object data) {
this.data.add(data);
}
}
此解决方案会将对 getData 和 setData 的调用锁定在 Container 实例的锁上。这很好,除非你要向这个类添加第三个方法,它根本不使用数据,那么如果任何线程在 getData 或 setData 中,它也会被阻塞。为了使其更具体,您可以这样做:
class Container {
private List<?> data;
public List<?> getData() {
synchronized (this.data) {
return this.data;
}
}
public void addData(Object data) {
synchronized (this.data) {
this.data.add(data);
}
}
}
这然后使用数据变量对象锁定。这样做的好处是,如果您添加不使用数据的第三个方法,那么它不会被调用 getData 或 setData 阻塞。
这是对 Java 并发安全性的基本概述,希望对您有所帮助。
请注意,您的问题的客户端-服务器性质实际上并没有太大变化。例如,如果您的线程是由通过 java servlet 或其他方式的每个请求的线程创建的,那么这一切都以完全相同的方式适用。
【讨论】: