我知道java线程相关的问题已被多次询问,但我无法拼凑出我的问题的答案。我仍然是线程编程的新手,所以请原谅我的无知。
我发现与一致性相关的问题,需要根据需要进行适当的同步。问题是关于在当前正在执行的线程中的对象上调用方法。考虑下面的例子(这是实验性的,所以借口任何糟糕的设计选择):
我的代码如下所示:
ThreadPoolExecutor pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
SearchWidget searchWidget = new SearchWidget(searchTerm);
Future<?> searchWidgetFuture = pool.submit(searchWidget);
Thread.sleep(2000);
System.out.println("1. Results so far:" + searchWidget.getCurrentResultsCount());
Thread.sleep(2000);
System.out.println("2. Results so far:" + searchWidget.getCurrentResultsCount());
Thread.sleep(2000);
System.out.println("3. Results so far:" + searchWidget.getCurrentResultsCount());
...
...
以我的方式调用getCurrentResultsCount()方法有什么不对或有风险吗?它似乎在低量使用时工作正常,但如果有更高的音量,我是否会冒问题?
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
以我的方式调用getCurrentResultsCount()方法有什么不对或有风险吗?
不,只要getCurrentResultsCount()
访问某些同步字段就没有错,因为共享数据正在两个不同的线程中进行更新和访问。我建议使用AtomicInteger
来存储此类信息。
它似乎在低量使用时工作正常,但如果有更高的音量,我是否会冒问题?
您为更新volatile
字段(AtomicInteger
内部)而支付了性能损失,但它相对较小。从表面上看,没有什么可担心的。增加后台任务的数量将大大超过JSP和线程之间的任何数据共享。