Hi, copyonwritearraylist is suitable for this case imho. But it don't sound
like an option to you. Would you share a bit more. I am interest to learn
about it.
On Dec 14, 2010 9:15 AM, "Patricia Shanahan" <[email protected]> wrote:
>
> You make a good point that I should take a look around to see if I can
find anything suitable that already exists, with appropriate licensing.
>
> That said, I believe the requirements for an outrigger FastList are:
>
> 1. Highly scalable performance. In particular, iterating over the list
should be fast even when many threads are doing it. As far as I can tell,
any JavaSpace lookup turns into iterating over a FastList representing items
of acceptable classes, to see if any of the nodes match the other template
requirements.
>
> 2. A limited set of features: Iterate over the list starting at the head,
remove a node, add at tail.
>
> The two libraries each go in a different direction.
>
> Javolution is primarily a single thread speed play, with fast and
predictable performance. It is what I would want if I were writing real time
code. It does have some support for concurrency, but not what is needed for
outrigger: "Fast collections (or maps) can be made thread-safe by marking
them FastCollection#shared shared Having a shared collection (or map) means
that it can be safely used without synchronization. It does not mean that a
change made by a thread is automatically viewed by another thread (that
would require synchronizing)."
>
> The Apache Commons collections are very feature rich, but seem to be
primarily single thread, with the synchronizing decorator approach to
concurrency.
>
> I will do some more web searching, but my current strongest contender for
an existing class is java.util.concurrent.ConcurrentLinkedQueue. It's main
limitation is slow remove, but that might be worked around by using a pair
of queues, and periodically cleaning by copying from one queue to another.
Also, java.util.concurrent contains a reference to an important paper,
http://www.cs.rochester.edu/u/michael/PODC96.html, that gives me a starting
point for finding the latest research on these issues.
>
> Patricia
>
>
>
>
>
> On 12/13/2010 4:30 PM, James Grahn wrote:
>>
>> Because there've been a few concerns about memory models and concurrent
>> data structures, I thought I'd suggest a couple of resources. Library
>> usage is preferable to reinventing the wheel, where possible:
>>
>> First:
>> http://javolution.org/
>>
>> I haven't used it directly; I've only used a library which used it. But
>> it perhaps deserves a scan to see if it would meet our requirements (and
>> testing to ensure it's acceptable if it claims to).
>>
>> Also, it's BSD-licensed. I believe that's acceptable?
>>
>> Second:
>> http://commons.apache.org/collections/index.html
>>
>> I don't *think* it has what we need, but it's worth poking around in
>> before creating a new datastructure. Has the advantage of being part of
>> the Apache family.
>>
>> jamesG
>>
>> On 12/13/2010 5:24 PM, Peter Firmstone wrote:
>>>
>>> Gregg Wonderly wrote:
>>>>
>>>> On 12/13/2010 12:34 PM, Gregg Wonderly wrote:
>>>>>
>>>>> This does fail fairly quickly (immediately) on my windows laptop.
>>>>>
>>>>> I am not sure that I have time to really look over this code. I
>>>>> wonder if anyone
>>>>> knows if this is relatively new code that John put together as part
>>>>> of the
>>>>> effort to remove the use of PSE from outrigger, or is the original
>>>>> "non-persistent" javaspaces implementation?
>>>>>
>>>>> Perhaps we need to do something different here, a segmented list for
>>>>> example,
>>>>> which is what PSE did with it's Vector implementation so that
>>>>> segments of the
>>>>> list could be locked independently, as well as allowing the segments
>>>>> to be
>>>>> "deleted" from disk once they were "empty".
>>>>
>>>>
>>>> And, of course if we pull out outrigger, as an application/service,
>>>> separate from the Jini part of river, we could just say that Outrigger
>>>> requires JDK1.5 so that we can move to a different concurrency
>>>> implementation if that is needed, using the new memory model.
>>>
>>>
>>> It seems like a lot of work to fix a package private implementation,
>>> already based on flawed assumptions (Patricia's done a great job
>>> debugging this, she's a real asset, I look forward to learning more
>>> debugging tips). I suspect we'll get a much better result starting from
>>> scratch, utilising Java 6.
>>>
>>> Since River is a Jini platform, why don't we start by creating an
>>> independent implementation of outrigger utilising any latest available
>>> java features. Not only will this produce a better implementation, that
>>> will be easier to support, but it might improve our understanding of
>>> what's required for a modular build as well.
>>>
>>> The existing outrigger implementation can remain as it is, but
>>> deprecated, left in place for legacy support.
>>>
>>> I've got some concurrent utilities in pepe you may pinch / improve if
>>> you like:
>>>
>>> org.apache.river.impl.util.*
>>>
>>> ConcurrentCollections
>>> ConcurrentSoftMap
>>> ConcurrentWeakIdentityMap
>>> ConcurrentWeakMap
>>>
>>> ConcurrentCollections is a multi read single write lock based collection
>>> wrapper. It defensively copies for Iterators but still allows performing
>>> removals from the underlying collection.
>>>
>>> The ConcurrentMap's are based on ConcurrentHashMap, using a
>>> ReferenceQueue to remove stale entries prior to every method call.
>>> Cheers,
>>>
>>> Peter.
>>>
>>>>
>>>> One of the things I did in griddle, was define a RemoteIterator which
>>>> allows a "get" operation to have a return value before anything is in
>>>> the space. A server side thread, then looks through the space for
>>>> matches and adds them to the return queue for the calling "get". This
>>>> allows server side contention to be managed to some degree because the
>>>> number of "searching" threads could be held to an appropriate minimum
>>>> (even one). The javaspaces API doesn't disallow such proxy
>>>> implementation and JavaSpaces05 iterator support starts to expose this
>>>> kind of thing more literally.
>>>>
>>>> Ultimately, I think a segmented list that looks like a
>>>> List<List<Entry>> would be a way to distribute locking for "get"
>>>> because iteration would be less likely to be on the same segment at
>>>> the same time.
>>>>
>>>> Insertion at the tail, is always a contentious issue for concurrent
>>>> lists. Sometimes you can just use a small ConcurrentHashMap to perform
>>>> adds until it gets to a particular size, and then turn its contents
>>>> into a List and add that list to the tail of the List<List<Entry>>.
>>>> You can choose then to decide when to do that movement by watching for
>>>> the other lists to be empty too, or when a traversal gets to the end
>>>> of what is in a list already.
>>>>
>>>> This keeps writers quite free to insert quickly and completely away
>>>> from the readers as well. Ordering presents most of the opportunities
>>>> for big time contention. Unordered (map), or more segmented (map of
>>>> list) construction relieves some of the contention if course, by
>>>> distributing it.
>>>>
>>>> Gregg
>>>>
>>>>> Gregg
>>>>>
>>>>> On 12/13/2010 12:16 AM, Patricia Shanahan wrote:
>>>>>>
>>>>>> On 12/12/2010 5:48 PM, Peter Firmstone wrote:
>>>>>>>
>>>>>>> Patricia Shanahan wrote:
>>>>>>>>
>>>>>>>> On 12/3/2010 7:15 AM, Gregg Wonderly wrote:
>>>>>>>> ...
>>>>>>>> > The important issue in FastList is that it was written with the
>>>>>>>> JDK1.4
>>>>>>>> > memory model. After moving River to Java 1.5, we'd have the
>>>>>>>> JSR166 work
>>>>>>>> > and the new, consistent memory model where volatile has a true
>>>>>>>> meaning.
>>>>>>>> > However, this code in particular is quite complex as you have
>>>>>>>> noted, so
>>>>>>>> > even adjusting to the new memory model could be problematic.
>>>>>>>>
>>>>>>>> I've just run a modified, simplified version of my test with java
>>>>>>>> version "1.4.2_19" and an unmodified copy of FastList, and I still
>>>>>>>> get
>>>>>>>> the NullPointerException. This changes my thinking a bit. I had
been
>>>>>>>> working from the assumption that the issue was to do with the
>>>>>>>> changes
>>>>>>>> in memory model between 1.4 and 1.5. I now have to consider the
>>>>>>>> possibility of a more basic bug that is independent of the memory
>>>>>>>> model.
>>>>>>>>
>>>>>>>> If there is anyone with a FastList or Java memory model background
>>>>>>>> who
>>>>>>>> would like to help, please reply. I would welcome another set of
>>>>>>>> eyes
>>>>>>>> on the code, and a cross check on my conclusions so far about how
>>>>>>>> FastList is supposed to work. There seems to be a critical
invariant
>>>>>>>> that gets broken, and once that happens we are on track to either a
>>>>>>>> NullPointerException or dropped items.
>>>>>>>>
>>>>>>>> I can supply my test as a unit test (JDK 1.6, Junit 4) and as a
main
>>>>>>>> program (JDK 1.4 or later0. In both forms, all

Reply via email to