Path: csiph.com!x330-a1.tempe.blueboxinc.net!aioe.org!goblin2!goblin.stu.neva.ru!news.nask.pl!news.nask.org.pl!news.icm.edu.pl!news.onet.pl!.POSTED!not-for-mail From: Michal Kleczek Newsgroups: comp.lang.java.programmer Subject: Re: Concurrent bidirectional one-to-many map? Date: Mon, 09 May 2011 16:42:53 +0200 Organization: http://onet.pl Lines: 58 Message-ID: References: NNTP-Posting-Host: 77-252-124-164.ip.netia.com.pl Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7Bit X-Trace: news.onet.pl 1304952170 16468 77.252.124.164 (9 May 2011 14:42:50 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Mon, 9 May 2011 14:42:50 +0000 (UTC) User-Agent: KNode/4.4.9 Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:3856 Sebastian wrote: > > Thanks for the idea. I do not yet see how to deal with the > one-to-many aspect of my problem. > > To give an example, I'm trying to solve a problem like this: > Associate tasks with workspaces, where a workspace may hold many > tasks,but a task may be associate with at most one workspace. > > Idea: > > private ConcurrentMap wsMap = > new ConcurrentHashMap(); > > public boolean isAssigned( Item item ) { > return wsMap.containsKey( item ); > } > > public void assign( Item item, Workspace ws ) { > wsMap.putIfAbsent( item, ws ); > if( !ws.equals( wsMap.get( item) ) ) { > throw new NotAssignableException(); > } > } > > > Now I want to be able to close a workspace, releasing all tasks > to be assignable again to other workspaces. > > public void closeWorkspace( Workspace ws ) { > // how do this efficiently? iterate over all > // entries (holding a write lock) and remove it > // when the value equals ws? > } > Maybe it is a dumb question but: is there any reason not to implement it simply as class Item { private Workspace workspace; //getters setters } class Workspace { private Collection items; //getters setters public close() { for (final Item item : items) { //release item } } } -- Michal