我有一个带有静态方法和单例类
的代码示例//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个线程调用我的一个方法时会发生什么?在处理集合时,我的数据是否有任何损坏方法? static方法有为它分配的公共内存,所以当2个线程调用静态方法时它会相互影响吗?在单例中只创建一个实例,如果2个线程调用具有单个实例的方法,它会相互影响吗?请帮助理解这一点。谢谢......
答案 0 :(得分:0)
从不同的线程调用静态方法不会破坏任何东西......除非方法正在使用/更改共享实例或静态变量,但在这种情况下,对于所有方法都是如此,而不仅仅是具有静态性质的方法。
这不是第一次有人对此感到困惑...请谷歌搜索或在Stackoverflow中搜索类似的问题。这个问题已被多次回答。
答案 1 :(得分:0)
无论使用静态方法还是单例都不会影响线程安全性。您的代码可能是线程安全的,也可能不是,具体取决于您执行的处理类型。 (如图所示,您的代码是线程安全的,因为映射是在getDataObject
和writeData
方法的本地创建的,因此不会在不同的线程之间共享。)
通常,如果不同的线程不同时访问相同的数据,则代码是线程安全的。此外,如果对象是只读的,则多个线程可以同时读取它而不会破坏线程安全性。只要一个线程修改共享数据,就必须同步对它的访问。
答案 2 :(得分:-1)
根据我对多线程的理解,它是多个线程将访问的共享对象。
因此,在您的两个程序中,map对象是将由多个线程访问的共享实例。所以你应该同步map对象以便线程安全。
Singleton或Static无法与此相关