我能解释一下Java中的线程和同步是如何工作的吗?
我想写一个高性能的应用程序。在这个应用程序中,我将文件中的数据读取到一些嵌套类中,这些类基本上是围绕 HashMap 的一个坚果壳。
数据读取完成后,我启动需要遍历数据并对其执行不同检查的线程。但是,线程永远不会更改数据!
如果我可以保证(或至少尝试保证;)我的线程永远不会更改数据,我可以使用它们调用包含数据的对象的非同步方法吗?
如果多个线程访问非同步方法,不改变任何类字段,但有一些内部变量,是否安全?
人工示例:
public class Data{
// this hash map is filled before I start threads
protected Map<Integer, Spike> allSpikes = new HashMap<Integer, Spike>();
public HashMap returnBigSpikes(){
Map<Integer, Spike> bigSpikes = new HashMap<Integer, Spike>();
for (Integer i: allSpikes.keySet()){
if (allSpikes.get(i).spikeSize > 100){
bigSpikes.put(i,allSpikes.get(i));
}
}
return bigSpikes;
}
}
从线程调用非同步方法 returnBigSpikes() 是否安全?
我现在明白这样的用例可能非常危险,因为很难控制数据(例如,返回的 bigSpikes)不会被修改。但是我已经像这样实现和测试了它,想知道我现在是否可以使用我的应用程序的结果,并在以后更改架构......
如果我使方法同步会发生什么?会不会将应用程序的 CPU 性能减慢到 1?如果是这样,我怎样才能正确设计它并保持性能?
(我将大约 20-40 Gb 的数据(日志消息)读入主内存,然后运行线程,这些线程需要遍历所有数据以找到其中的一些相关性;每个线程仅成为要分析的消息的一部分;但是为了进行分析,线程应该将其部分的每条消息与来自数据的许多其他消息进行比较;这就是为什么我首先决定允许线程在不同步的情况下读取数据)。
非常感谢您提前。