我刚读完这篇文章: Java-5 ThreadPoolExecutor比Java-7 ForkJoinPool有什么优势? 觉得答案不够直白。 你能用简单的语言和例子来解释一下,Java 7的Fork-Join框架和旧的解决scheme之间的权衡是什么? 我还读了关于Java技巧的Java #1的命中:什么时候使用来自javaworld.com的 ForkJoinPool vs ExecutorService ,但文章没有回答标题问题时 ,它主要谈论API差异…
我正在实现一个线程池机制,我想执行不同优先级的任务。 我想有一个很好的机制,我可以提交一个高优先级任务的服务,并安排在其他任务之前。 任务的优先级是任务本身的一个固有属性(无论我将这个任务表示为Callable还是可运行对我来说都不重要)。 现在,从表面上看,我可以在我的ThreadPoolExecutor使用PriorityBlockingQueue作为任务队列,但该队列包含Runnable对象,这可能是也可能不是我已经提交给它的Runnable任务。 而且,如果我已经提交了Callable任务,目前还不清楚这将如何映射。 有没有办法做到这一点? 我真的不想为此而推出自己的产品,因为我更有可能错误地这样做。 (撇开,是的,我意识到在这样的事情中可能会出现对于优先级较低的工作的匮乏,对于公平合理保证的解决scheme,加分(?!)
在SQL数据库中处理并发更新的常用方法是什么? 考虑一个简单的SQL模式(约束和默认值没有显示..) create table credits ( int id, int creds, int user_id ); 其目的是为用户存储某种types的信用,例如像stackoverflow的信誉。 如何处理该表的并发更新? 几个选项: update credits set creds= 150 where userid = 1; 在这种情况下,应用程序检索当前值,计算新值(150)并执行更新。 如果有人在同一时间做同样的事情,这会造成灾难。 我猜测包装当前价值的复苏,并在交易更新将解决,例如Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end; Begin; select creds […]
我知道同步方法和同步块之间的区别,但我不确定关于同步块部分。 假设我有这个代码 class Test { private int x=0; private Object lockObject = new Object(); public void incBlock() { synchronized(lockObject) { x++; } System.out.println("x="+x); } public void incThis() { // same as synchronized method synchronized(this) { x++; } System.out.println("x="+x); } } 在这种情况下使用lockObject和使用这个锁作为区别? 对我来说似乎是一样的.. 当你决定使用同步块时,你如何决定哪个对象是锁?
我在这个博客文章中发现了CompletionService。 但是,这并没有真正展示CompletionService比标准ExecutorService更有优势。 相同的代码也可以写入。 那么,CompletionService何时有用呢? 你可以给一个简短的代码样本,使其透明? 例如,这个代码示例只显示不需要CompletionService(=相当于ExecutorService) ExecutorService taskExecutor = Executors.newCachedThreadPool(); // CompletionService<Long> taskCompletionService = // new ExecutorCompletionService<Long>(taskExecutor); Callable<Long> callable = new Callable<Long>() { @Override public Long call() throws Exception { return 1L; } }; Future<Long> future = // taskCompletionService.submit(callable); taskExecutor.submit(callable); while (!future.isDone()) { // Do some work… System.out.println("Working on something…"); } try { System.out.println(future.get()); } […]
阅读JSR-133编译器编写者手册,了解易失性的实现,特别是“与primefaces指令的交互”部分。我假设读取一个易失性variables而不更新它需要一个LoadLoad或一个LoadStore的障碍。 再往下看,LoadLoad和LoadStore在X86 CPU上是无效的。 这是否意味着可以在x86上执行易失性读操作而不显示caching失效,并且像正常variables读取一样快(不考虑volatile的重sorting约束)? 我相信我不明白这一点。 有人能照顾我吗? 编辑:我不知道在多处理器环境中是否有差异。 在单CPU系统上,CPU可能会看它自己的线程caching,正如John V.指出的那样,但是在多CPU系统中,CPU必须有一些configuration选项,这是不够的,主存必须被命中,使得volatile变慢在多CPU系统上,对吗? PS:在我学习更多关于这个的方法中,我偶然发现了以下很棒的文章,因为这个问题可能对别人很有趣,所以我会在这里分享我的链接: Java理论与实践:修复Java存储模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分
什么是Java中的互斥和信号量? 主要区别是什么?
我search了Swift书,但是找不到@synchronized的Swift版本。 我如何在Swift中互相排斥?
是否有可能重写这个代码,以更好地使用处理器? 我有一个类,它在一个单独的线程中执行固定的周期的一些任务。 有时这个过程可以暂停和恢复。 目前我正在使用一个标志暂停,它工作正常,但循环这种方式仍然加载处理器时进程暂停。 有没有可能解决这个问题? private boolean mIsCanceled = false; private boolean mIsPaused = true; // TODO more efficient for processor way of pausing is required private final Thread mTimerThread = new Thread(new Runnable() { @Override public void run() { while(!mIsCanceled){ try { Thread.sleep(UPDATE_PERIOD); } catch (InterruptedException e) { e.printStackTrace(); } if (!mIsPaused){ doStep(); } […]
我正在查看Brian Goetz的“Java Concurrency in Practice”中的代码示例。 他说,这个代码可能会停留在一个无限循环中,因为“准备就绪”的值可能永远不会被读者线程看到“。 我不明白这是怎么发生的… public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.println(number); } } public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = true; } }