多线程环境中的静态方法与单例方法
static method vs singleton methods in multithreaded environment
我有一个包含静态方法和单例的代码示例class
//code with static methods
public class DataManager{
public static Object getDataObject(){
HashMap map = new HashMap();
//Some processing in collections
//retrieval of data
}
public static void writeData(Object o){
HashMap map = new HashMap();
//Some processing in collections
//writing data
}
}
//code with singleton
public class DataManager{
private static DataManager instance;
private DataManager(){
}
public static DataManager getInstance(){
if(instance == null){
synchronized(DataManager.class){
if(instance == null){
instance = new DataManager();
}
}
}
return instance;
}
public Object getDataObject(){
HashMap map = new HashMap();
//Some processing in collections
//retrieval of data
}
public writeData(Object o){
HashMap map = new HashMap();
//Some processing in collections
//writing data
}
}
哪种使用方式最好。
当 2 个线程调用我的方法之一时会发生什么?在处理集合时,我的数据有什么方法会损坏吗?静态方法分配了公共内存,那么当2个线程调用静态方法时会相互影响吗?在单例中只创建一个实例,如果 2 个线程调用一个具有单个实例的方法,它会相互影响吗?请帮助理解这一点。谢谢...
从不同的线程调用静态方法不会破坏任何东西...除非方法是 using/altering 共享实例或静态变量,但在那种情况下它适用于所有方法,而不仅仅是静态方法自然。
这不是第一次有人对此感到困惑...请 google 它或在 Whosebug 中搜索类似问题。此问题已回答多次。
根据我对多线程的理解,多线程访问的是共享对象。
所以在你的两个程序中,映射对象是共享实例,将被多个线程访问。所以你应该同步地图对象以确保线程安全。
单例或静态与此无关
使用静态方法还是单例不影响线程安全。您的代码可能是线程安全的,也可能不是,这取决于您执行的处理类型。 (如图所示,您的代码是线程安全的,因为映射是在 getDataObject
和 writeData
方法本地创建的,因此不会在不同线程之间共享。)
一般来说,如果不同线程不同时访问相同数据,则代码是线程安全的。此外,如果一个对象是只读的,多个线程可以同时读取它而不会破坏线程安全。一旦一个线程修改了共享数据,您就必须同步对它的访问。
我有一个包含静态方法和单例的代码示例class
//code with static methods
public class DataManager{
public static Object getDataObject(){
HashMap map = new HashMap();
//Some processing in collections
//retrieval of data
}
public static void writeData(Object o){
HashMap map = new HashMap();
//Some processing in collections
//writing data
}
}
//code with singleton
public class DataManager{
private static DataManager instance;
private DataManager(){
}
public static DataManager getInstance(){
if(instance == null){
synchronized(DataManager.class){
if(instance == null){
instance = new DataManager();
}
}
}
return instance;
}
public Object getDataObject(){
HashMap map = new HashMap();
//Some processing in collections
//retrieval of data
}
public writeData(Object o){
HashMap map = new HashMap();
//Some processing in collections
//writing data
}
}
哪种使用方式最好。 当 2 个线程调用我的方法之一时会发生什么?在处理集合时,我的数据有什么方法会损坏吗?静态方法分配了公共内存,那么当2个线程调用静态方法时会相互影响吗?在单例中只创建一个实例,如果 2 个线程调用一个具有单个实例的方法,它会相互影响吗?请帮助理解这一点。谢谢...
从不同的线程调用静态方法不会破坏任何东西...除非方法是 using/altering 共享实例或静态变量,但在那种情况下它适用于所有方法,而不仅仅是静态方法自然。
这不是第一次有人对此感到困惑...请 google 它或在 Whosebug 中搜索类似问题。此问题已回答多次。
根据我对多线程的理解,多线程访问的是共享对象。
所以在你的两个程序中,映射对象是共享实例,将被多个线程访问。所以你应该同步地图对象以确保线程安全。
单例或静态与此无关
使用静态方法还是单例不影响线程安全。您的代码可能是线程安全的,也可能不是,这取决于您执行的处理类型。 (如图所示,您的代码是线程安全的,因为映射是在 getDataObject
和 writeData
方法本地创建的,因此不会在不同线程之间共享。)
一般来说,如果不同线程不同时访问相同数据,则代码是线程安全的。此外,如果一个对象是只读的,多个线程可以同时读取它而不会破坏线程安全。一旦一个线程修改了共享数据,您就必须同步对它的访问。