> On Jul 7, 2020, at 6:56 PM, Gary Gregory <garydgreg...@gmail.com> wrote:
>
> In the PR https://github.com/apache/commons-lang/pull/559 I am going with
> "LockingVistors".
I like this name because of its brevity yet clarity.
-Rob
>
> Gary
>
> On Tue, Jul 7, 2020 at 2:33 PM Rob Tompkins <chtom...@gmail.com> wrote:
>
>> I’m not all that familiar with that area of academia. Let me see what I
>> can dig up
>>
>> -Rob
>>
>>> On Jul 7, 2020, at 2:19 PM, Matt Sicker <boa...@gmail.com> wrote:
>>>
>>> Are there any academic references for this? Or even something from
>>> Java Concurrency in Practice? Those are good sources for names around
>>> concurrency.
>>>
>>> On Tue, 7 Jul 2020 at 12:42, Rob Tompkins <chtom...@gmail.com> wrote:
>>>>
>>>> Why not make the name “ThreadedLambdaSynchronizer” or something like
>> that….just something more descriptive here that get’s closer to what the
>> intended functionality is.
>>>>
>>>> That said, I’m not particularly tied to the name
>> “ThreadedLambdaSynchronizer” just spitballing here for something more
>> descriptive than “Lock”
>>>>
>>>> -Rob
>>>>
>>>>> On Jun 29, 2020, at 12:58 PM, Matt Sicker <boa...@gmail.com> wrote:
>>>>>
>>>>> Now that starts to sound like Apache Groovy or Kotlin.
>>>>>
>>>>> On Mon, 29 Jun 2020 at 11:58, Xeno Amess <xenoam...@gmail.com> wrote:
>>>>>>
>>>>>> soemtimes I really wish to rewrite/add some functions in jdk
>> directly...
>>>>>> especially for reusing some package private static functions...
>>>>>>
>>>>>> Gary Gregory <garydgreg...@gmail.com> 于2020年6月30日周二 上午12:01写道:
>>>>>>
>>>>>>> I'm not sure talking to the JDK folks is helpful IMO. We are still
>>>>>>> targeting Java 8. The customers I deal with are migrating from 8 to
>> 11, and
>>>>>>> Java 11 is not everywhere our customers are. So talking about
>> something
>>>>>>> that might end up in Java... 25 seems to be not in our user's best or
>>>>>>> immediate interest. It might be good for Java in the long oh so long
>> term
>>>>>>> of course.
>>>>>>>
>>>>>>> Gary
>>>>>>>
>>>>>>> On Mon, Jun 29, 2020 at 8:31 AM Rob Tompkins <chtom...@gmail.com>
>> wrote:
>>>>>>>
>>>>>>>> At first look, I’m a little surprised we’re trying to take on this
>>>>>>>> functionality. Has anyone reached out to the JDK guys to see if
>> they’d be
>>>>>>>> interested in having it in the JDK? That said, if we approach it
>> from
>>>>>>> that
>>>>>>>> path, we would lose the functionality in older versions of java. So
>>>>>>> maybe I
>>>>>>>> just talked myself out of the idea of putting it in the JDK....
>>>>>>>>
>>>>>>>> Just wanted to stream of consciousness my initial gut vibe.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> -Rob
>>>>>>>>
>>>>>>>>> On Jun 26, 2020, at 10:07 AM, Gary Gregory <garydgreg...@gmail.com
>>>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> Hi All:
>>>>>>>>>
>>>>>>>>> I know email is a challenging medium for code reviews, so please
>>>>>>> consider
>>>>>>>>> these comments coming from my best intentions, constructive and
>> caring
>>>>>>>> ;-)
>>>>>>>>> Also please excuse the meandering nature of this post.
>>>>>>>>>
>>>>>>>>> The new class org.apache.commons.lang3.concurrent.Locks.Lock needs
>>>>>>> better
>>>>>>>>> names IMO, not just the class name. There is already a JRE
>> interface
>>>>>>>> called
>>>>>>>>> Lock so this class name is confusing (to me.)
>>>>>>>>>
>>>>>>>>> The Javadoc reads in part:
>>>>>>>>>
>>>>>>>>> * This class implements a wrapper for a locked (hidden) object,
>> and
>>>>>>>>> * provides the means to access it. The basic idea, is that the
>> user
>>>>>>>>> * code forsakes all references to the locked object, using only
>> the
>>>>>>>>> * wrapper object, and the accessor methods
>>>>>>>>>
>>>>>>>>> But this is not the case, the object itself is not locked in
>>>>>>>>> the traditional sense with a monitor through a synchronized block,
>> so
>>>>>>> we
>>>>>>>>> need to update the Javadoc as well.
>>>>>>>>>
>>>>>>>>> To me, this is more about executing blocks of code (through
>> lambdas)
>>>>>>>> which
>>>>>>>>> then get 'safe' (via locking) access to an underlying object. This
>>>>>>> tells
>>>>>>>> me
>>>>>>>>> the class is more about the functional interfaces than about a
>> domain
>>>>>>>>> "Object", hence the name "Lock" is not the best. It's really more
>> of a
>>>>>>>>> visitor where the visitation pattern is: Lock, Visit, Unlock.
>>>>>>>>> Instead, maybe:
>>>>>>>>> - StampledLockVisitor (more specific)
>>>>>>>>> - LockingVisitor (more general)
>>>>>>>>> - SafeObject (vague)
>>>>>>>>> - ObjectLocker (vague)
>>>>>>>>> - rejected: LockedObject since the object itself is not locked.
>>>>>>>>> - ?
>>>>>>>>>
>>>>>>>>> What is also confusing IMO is that the instance variable for the
>> object
>>>>>>>> is
>>>>>>>>> called "lockedObject" but the object is in fact NOT locked all the
>>>>>>> time.
>>>>>>>> So
>>>>>>>>> that needs to be renamed IMO:
>>>>>>>>> - object (the simplest)
>>>>>>>>> - subject
>>>>>>>>> - domain
>>>>>>>>> - target
>>>>>>>>> - ?
>>>>>>>>>
>>>>>>>>> In the same vein, the StampedLock is named "lock" which is also
>>>>>>> confusing
>>>>>>>>> since StampedLock does not implement Lock.
>>>>>>>>>
>>>>>>>>> Why can't the domain object be null, it's never used by the
>> framework?
>>>>>>>>> Why this:
>>>>>>>>> if (t == lockedObject) {
>>>>>>>>> throw new IllegalStateException("The returned
>> object
>>>>>>>>> is, in fact, the hidden object.");
>>>>>>>>> }
>>>>>>>>> ?
>>>>>>>>> This seems like an application specific constraint that has
>> nothing to
>>>>>>> do
>>>>>>>>> with the framework.
>>>>>>>>>
>>>>>>>>> Now that I've considered the above, the API Locks.lock(O) is really
>>>>>>>>> misnamed, because it does not lock anything, it's a factory method.
>>>>>>>>>
>>>>>>>>> Stepping back even more, since there is only a static inner class
>> in
>>>>>>>> Locks,
>>>>>>>>> and no-hint that alternative implementations for different kind of
>>>>>>> locks
>>>>>>>>> are possible, I would say we do not need Locks, all we need is
>> what is
>>>>>>>> now
>>>>>>>>> called Lock.
>>>>>>>>>
>>>>>>>>> It's not clear why some methods are protected, I would make those
>>>>>>>> private.
>>>>>>>>> It's not like I can use or plugin a Lock, ReentrantReadWriteLock, a
>>>>>>>>> ReentrantLock, or any ReadWriteLock instead of a StampedLock. I
>> would
>>>>>>>> then
>>>>>>>>> make the current Lock class a standalone class which can then be
>> used
>>>>>>>> later
>>>>>>>>> from a factory class (now Locks) where we can then fill in with
>>>>>>> different
>>>>>>>>> implementations.
>>>>>>>>>
>>>>>>>>> The Javadoc talks about a "hidden" object but it is not hidden
>> since it
>>>>>>>> is
>>>>>>>>> passed to all visitors!
>>>>>>>>>
>>>>>>>>> This test assumption is wrong:
>>>>>>>>>
>>>>>>>>> If our threads are running concurrently, then we expect to be
>>>>>>>>> faster
>>>>>>>>> than running one after the other.
>>>>>>>>>
>>>>>>>>> The VM or Java spec makes no such guarantee and the tests have no
>>>>>>> control
>>>>>>>>> over VM scheduling. There are cases where this will fail when under
>>>>>>> heavy
>>>>>>>>> load for example where the cost of additional threads becomes
>>>>>>>> overwhelming.
>>>>>>>>>
>>>>>>>>> Another item I am quite doubtful about is hiding checked
>> exceptions by
>>>>>>>>> rethrowning them as unchecked. I'd consider this an anti-pattern.
>> If I
>>>>>>> am
>>>>>>>>> using one of our "Failing" interfaces it is because I am expecting
>> it
>>>>>>> to
>>>>>>>>> fail. Perhaps this could be made smoother by refactoring to pass
>> in a
>>>>>>>>> lambda for an exception handler.
>>>>>>>>>
>>>>>>>>> I've crystallized my thoughts into code here as WIP (Javadoc needs
>>>>>>> work):
>>>>>>>>> https://github.com/apache/commons-lang/pull/559
>>>>>>>>>
>>>>>>>>> Not as important as the above:
>>>>>>>>> The example in the Javadoc uses logging as its domain subject, a
>>>>>>>> "logging"
>>>>>>>>> API (PrintStream) which is not a good example IMO. Logging
>> frameworks
>>>>>>>>> today like Log4j handle multi-threaded applications normally
>> without
>>>>>>>> having
>>>>>>>>> developers meddle in it. Yes, I understand it's a simple example
>> but I
>>>>>>> am
>>>>>>>>> hoping we can come up with something more realistic or useful.
>>>>>>>>>
>>>>>>>>> Thank you,
>>>>>>>>> Gary
>>>>>>>>
>>>>>>>>
>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Matt Sicker <boa...@gmail.com>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
>>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>>> For additional commands, e-mail: dev-h...@commons.apache.org
>>>>
>>>
>>>
>>> --
>>> Matt Sicker <boa...@gmail.com>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>> For additional commands, e-mail: dev-h...@commons.apache.org
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>> For additional commands, e-mail: dev-h...@commons.apache.org
>>
>>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org