Tag: 并发

了解Synchronized的行为

我正在努力提高对synchronized调用期间发出的锁定范围的理解。 例如: class CopyOnReadList { private final List items = new ArrayList(); public void add(T item) { items.add(item); } public List makeSnapshot() { List copy = new ArrayList(); synchronized (items) { // Make a copy while holding the lock. for (T t : items) copy.add(t); } return copy; } } (代码精心借鉴了这个优秀的答案 ) 在这段代码中,一个线程可以调用add而另一个调用makeSnapshot吗? 即,由synchronized (items)创建的锁是否会影响对items所有尝试读取,或仅影响通过makeSnapshot()方法尝试的那些? […]

tryLock方法 – 非阻塞方法?

tryLock方法的文档说它是一种非阻塞方法 它允许您获取/获取锁(如果在调用方法时可能)。 但我想知道:你怎么能获得锁定并同时保证 你的方法( tryLock )是非阻塞的吗?! 获取锁意味着你 试图访问受保护的代码部分,以便它应该阻止(如果你不幸运 即你应该至少在某些情况下阻止)。 任何人都可以解释逻辑 这背后? 纯粹从逻辑的角度来看:我不太明白这是怎么回事 完成(保证方法不会阻止)。 除非他们使用另一个 线程当然在tryLock本身的代码中…… http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html#tryLock%28%29

netty的并发编码

编码器的编码方法会同时执行吗? 我观察到编码方法可能由不同的线程并发。 管道定义为: Channels.pipeline( idleHandler, new AmfDecoder(GameEvent.class), new AmfEncoder(), concurrencyHandler, new WebHandler()); 编码器: public class AmfEncoder extends OneToOneEncoder{ private final SerializationContext serializationContext = new SerializationContext(); private final Amf3Output amfout = new Amf3Output(serializationContext); @Override protected Object encode(ChannelHandlerContext arg0, Channel arg1, Object arg2) throws Exception { T e = (T)arg2; ByteArrayOutputStream byteoutStreamSize = new ByteArrayOutputStream(); amfout.setOutputStream(byteoutStreamSize); amfout.writeObject(e.getBody()); […]

为什么LogWriter中的竞争条件会导致生产者阻塞?

首先要防止标记问题由不喜欢读到最后的人重复我已经阅读了生产者 – 消费者日志服务,并且关闭问题的方式不可靠 。 但它没有完全回答问题和答案与书中的文字相矛盾。 在书中提供以下代码: public class LogWriter { private final BlockingQueue queue; private final LoggerThread logger; private static final int CAPACITY = 1000; public LogWriter(Writer writer) { this.queue = new LinkedBlockingQueue(CAPACITY); this.logger = new LoggerThread(writer); } public void start() { logger.start(); } public void log(String msg) throws InterruptedException { queue.put(msg); } private class […]

同步以确保另一个线程将看到对不可变对象的引用

我正在研究这个,以了解新JMM中最终字段的行为(5以后)。 这个概念很清楚:在正确构造对象之后,保证初始化的最终字段对所有线程的可见性。 但是在本节的最后,我读到了这个,这让我感到困惑: 现在,说完所有这些,如果在一个线程构造一个不可变对象(即一个只包含最终字段的对象)之后,你想确保所有其他线程都能正确看到它,你通常还需要使用同步。 例如,没有其他方法可以确保第二个线程可以看到对不可变对象的引用。 这是否意味着虽然单个最终字段(组成不可变对象)没有同步(例如,此处可见性)问题。 但是,在线程中首次创建的不可变对象本身在其他线程中可能不可见(正确创建)? 如果是这样,虽然我们可以跨线程共享初始化的不可变对象而没有任何线程不安全的担忧,但在创建时,他们需要“特别关注”线程安全,就像其他可变项一样?

为什么这个简单的线程程序会卡住?

看看这个简单的Java程序: import java.lang.*; class A { static boolean done; public static void main(String args[]) { done = false; new Thread() { public void run() { try { Thread.sleep(1000); // dummy work load } catch (Exception e) { done = true; } done = true; } }.start(); while (!done); System.out.println(“bye”); } } 在一台机器上,它打印“再见”并立即退出,而在另一台机器上,它不打印任何东西并永远坐在那里。 为什么?

并发集合的包含方法是无用的吗?

if(concurrentHashMap.containKey(key)) { // oops, v has been removed in another thread right after current thread // complete containKey calling Value v = concurrentHashMap.get(key); // do something on v // null pointer exception } 似乎并发集合的包含类方法是无用的,以解决上述问题: Vaule v = concurrentHashMap.get(key); if(v != null) { // ok, hold v’s reference // do something on v } 我对吗?

Java中的多个对象锁?

锁定私有字段变量(而不是使用锁定对象)是安全/可接受的做法吗? 这样,我可以有不同的锁用于不同的目的。 示例如下: class Test { private Integer x = 0; private Integer y = 0; public void incrementX() { synchronized(x) { x++; } } public void decrementX() { synchronized(x) { x++; } } public void incrementY() { synchronized(y) { y++; } } public void decrementY() { synchronized(y) { y++; } } 或者我应该为每个想要锁定的私人会员拥有一个锁定对象? 例: class […]

有状态会话beanmultithreading访问

EJB 3.2规范说明如下: 默认情况下,允许客户端对有状态会话对象进行并发调用,并且需要容器序列化此类并发请求。 请注意,容器永远不允许multithreading访问实际的有状态会话Bean实例。 对我来说,并发访问和multithreading访问似乎是等效的。 那么如何在禁止多个线程的情况下对有状态EJB进行并发调用呢?

未来取消方法文档

根据http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html,如果调用了cancel(boolean mayInterruptIfRunning)则isDone返回true 。 此方法返回后,对isDone()的后续调用将始终返回true。 但是,任务可能正在运行且mayInterruptIfRunning设置为false 。 那么,在那次调用之后应该返回什么isDone() ? true因为取消(这是错误的)? 此外,还不清楚cancel(boolean)方法是否返回false 。 PS我正在实现一些简单的线程池,所以我inheritance了Future 。