Re: Swing/AWT concurrency

Brian S O'Neill via Concurrency-interest <[email protected]> Tue, 20 Jul 2021 16:18:32 -0700
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <[email protected]>
I was able to reproduce the problem by changing the example code to have 
an empty loop body. It now looks like this:

   while (!done) {}
   tm.setText("" + new java.util.Date());

A new user might not understand the benefit of adding the sleep in the 
loop, but adding that back in does prevent hoisting.

I don't think the problem is totally made up. I've worked with new and 
experienced programmers who make mistakes like this, and it's not at all 
obvious why this is a problem.


On 2021-07-20 02:38 PM, Alex Otenko wrote:
> I think the problem is totally made up. You can't be using Swing, and 
> not know about threads. Thread safety clauses are all over documentation 
> for components. The hoist that Gregg has an issue with can happen only 
> if non-thread-safe methods are used. Other methods are likely using 
> locks inside, so even though not synchronized properly, the hoisting in 
> question simply cannot happen.
> 
> I was hoping to see a working example that shows otherwise.
> 
> Alex
> 
> On Tue, 20 Jul 2021, 21:47 Brian S O'Neill via Concurrency-interest, 
> <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>     This is a continuation of the "Are there real use cases with the Java
>     access modes?", but in a separate discussion thread to maintain
>     focus on
>     what I feel is the crux of the matter.
> 
>     Gregg pointed out a potential problem that can affect new Java users
>     when writing desktop applications. In particular, one thread can set a
>     shared "isDone" field, and another thread might never observe this. In
>     practice, the specific example which was provided wouldn't actually
>     have
>     a problem, but knowing why this is the case isn't something that a new
>     Java user would have any knowledge of. In other languages/frameworks,
>     users don't need to understand concurrency except as an advanced topic.
> 
>     The suggested solution is to require that all fields be volatile as
>     default. This naturally causes a knee-jerk reaction to anyone who wants
>     the Java platform to be concurrent and highly efficient. And for those
>     of us who mostly write server-side applications, we don't understand
>     why
>     this change is needed at all. After all, there's a bunch of modern
>     async/task scheduling frameworks available that allow new users to
>     write
>     safe, efficient, and completely non-surprising programs.
> 
>     New users of Swing/AWT don't have this luxury. And to them, Java ==
>     Swing, and so any problems in Swing are equivalent to problems in Java
>     itself.
> 
>     Would declaring all fields as volatile actually fix Swing? Not really.
>     Consider the case in which one thread does this:
> 
>        isDone = true;
>        doneMessage = "all done!";
> 
>     Both fields are volatile, and both are thus visible to other threads.
>     Except what I did is wrong, and it's not obvious to a new user. In
>     their
>     head, they think, "this task is done, and the message is 'all
>     done'". So
>     naturally the code should be written the same way. In almost all cases,
>     this works just fine. Randomly it fails, and now you have to explain to
>     the new user the concepts of concurrency, sequential consistency, etc.
> 
>     If Swing/AWT was designed around a "pure" event loop, then all tasks
>     run
>     atomically, and so the order in which fields are assigned isn't
>     relevant. They don't need to be volatile either. If the event loop
>     implementation wants to use multiple threads, then it's responsible for
>     using the correct thread-safe constructs and memory barriers to prevent
>     strange issues from cropping up.
> 
>     Modern frameworks exist on the server side to do just this, but have
>     they been adapted for writing desktop apps? Is there an alternative to
>     Swing/AWT? If not, my hope is that someone reading this becomes
>     inspired
>     to write such a thing. In the past, this seemed quite scary because it
>     would likely involve a bunch of JNI coding. Hopefully the Panama
>     project
>     will take the sting out of this.
> 
>     By the way, I know very little about "real world" Swing
>     applications. My
>     understanding of the issues might be wrong, so please be nice!
>     _______________________________________________
>     Concurrency-interest mailing list
>     [email protected]
>     <mailto:[email protected]>
>     http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>     <http://cs.oswego.edu/mailman/listinfo/concurrency-interest>
> 
_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest