Re: Are there real use cases with the Java access modes?

Alex Otenko via Concurrency-interest <[email protected]> Tue, 20 Jul 2021 10:46:12 +0100
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <CANkgWKii7g9g1kv8v6dQa_i13bi6gz+GHzs9mW-fX0aM+x1U7Q@mail.gmail.com>
Maybe java is the wrong tool for introducing people to programming. Maybe
hobbyists will be fine with Python.

As for the claim about Kafka server app - I find it extraordinary that
there be a loop with the thread-safe body that interacts with other
threads, and yet experiences the hoisting that you complain about.

I've seen a lot of incorrect double-checked locking, which stems from the
same "issue" of having non-volatile by default - and have never seen any
impact from that. Which is to say that I find it surprising that you
encounter hoisting happening so frequently.

Alex

On Mon, 19 Jul 2021, 22:54 Gregg Wonderly via Concurrency-interest, <
[email protected]> wrote:

> Thanks for you comments.   I am still trying to assert that the problem is
> this kind of assumption about people writing the code, actually being
> trained software engineers.  Instead, think of them as self taught coders.
> People who only every wrote “basic” or “vb” style integrations with just
> some knowledge that threads even exist, let alone, as in this case, knowing
> that the AWT event queue is involved and that there are threads (or more in
> the case of dialogs and other blocking actions) reaping events from the
> queue and dispatching them into your code.  Even the term callback or
> listener, for these people, doesn’t invoke any picture of “two” things
> working together.
>
> I think my perspective may be something I assume everyone sees too.   In
> the 1990s, as Java rolled out and Mosaic “was” the web browser, we had
> “HTML authors” deployed en-masse to construct the web.  There were all the
> “software engineers” trying to solve the web server problems and create
> J2EE and lots of server side things by real software systems engineers.
> Yet, 90% of people creating the web, were HTML authors, or later because
> Javascript codes (because Java was too big for the 32mb-128mb
> client/desktop PCs where applets where being attempted, but which couldn’t
> survive because they caused HUGE paging loads on under equipped PCs.
> Later, these coders learned all kinds things like PHP, and 10’s if not
> 100’s of JavaScript platforms and libraries to do things on their HTML
> pages.
>
> Then, there's the hobbiests that do technical things with small bits of
> software that they get from other people.  They try to “add” stuff, and
> “fix” stuff and contribute to all kinds of small communities of people
> using little Java desktop applications to facilitate portability to
> multiple computer platforms because many have PCs, some have Macs and some
> have Linux machines, and they want to all be able to do the same things,
> like use their home automation or other simple uProcessor control things
> etc.  These people have no idea how processors work in many cases.  They
> know nothing about caches, coherency, fences, etc.  Threads are something
> they’ve probably heard about, but they think of those as “server” things
> that make it possible to do a lot of things at once.   They are trying to
> create applications that don’t have “busy” things to do.  They write loops,
> like I did here, that just use timers, because some of them used to write
> MSDOS code with such timing loops for animations etc.  It’s this type of
> person that I am trying to highlight here.
>
> I participate in several different technical communities like Amateur
> Radio where I’ve wanted to get the community to adopt Java as the preferred
> platform for lots of desktop application things.  I’ve written and shared
> lots of “jar-based” apps that would help people do interesting things in
> such communities.  But, the uptake has just been a huge hill, because Java
> is just too hard for them to comprehend all the details to get started.
> There’s lots of details and things that I don’t really want to inject into
> this conversation.  But, I just want to point out that there are things
> like this particular issue, which “break” code by default.
>
> Just 20mins ago I was having a discussion with a fairly new developer who
> had some questions about creating a “timing” class that would let him
> observe a count of operations over time, and then use the starting and
> ending time to show a “bandwidth” figure.  We talked about volatile and
> sharing related to the class fields and whether he should leave them
> non-volatile, use volatile or atomic references, synchronized methods etc.
> And then he went right to another recent problem he had solved where this
> EXACT example had been encountered.  This was not in a desktop app but a
> Kafka based server app.  He had spent some period of time to workout that
> he need to make the boolean volatile to get the callback that changed the
> value of the boolean to be observed by the thread using the boolean for the
> loop control.
>
> I still contend this is a surprise to many people.  They probably figure
> it out if they don’t have a choice to “move on” from solving the problem.
> And once they figure out the volatile declaration, they have a keyword to
> look up and read about etc.  The default behavior of not having a
> designation for the default non-volatile “hoist” is really a problematic
> implicit behavior that is not the first thought process for many in my
> experience.  It’s the choice to “move on” that I feel drives people away
> from Java in some cases, because they really don’t now how to search for
> this problem because it’s by default.  There are lots of examples of “my
> loop doesn’t exit” for lots of other languages for countless reasons.  But
> not really anything on places like stackoverflow.com unless you know to
> include volatile and java.  Then you see this example:
>
>
> https://stackoverflow.com/questions/55322624/why-is-this-code-not-going-into-an-infinite-loop-as-suggested-by-jsr133
>
> which illustrates that the hoist starts happening if there are no call
> outs in the loop that the compiler can’t trace completely through, then the
> hoist doesn’t happen.  It’s this irregular behavior that just adds further
> to the frustration.
>
> Gregg Wonderly
>
> On Jul 19, 2021, at 11:01 AM, Valentin Kovalenko via Concurrency-interest <
> [email protected]> wrote:
>
> Hi Gregg,
>
> > There is no explicit indication of Thread usage
>
> There is only one explanation I can think of with regard to how the code
> in the listener added via `addActionListener` can be run: by a
> `java.lang.Thread` different from the one running `main` and blocked in
> `open` (this statement remains true even if one thinks about the project
> Loom). If an engineer writing the code like that does not even question
> himself about how can this application in principle be run in a single
> thread (that's the assumption in the example), then eliminating some
> optimizations that clearly do not violate JMM helps nothing. That same
> engineer can then pass between threads not a single `boolean`, but a more
> complex piece of data the same way with the same assumption (that there is
> only one thread), and be surprised to the same extent to observe not the
> piece of data that was shared. In fact, I think that the more often
> incorrectly synchronized code fails, the more likely it is that the author
> will discover and fix the bug, potentially improving his understanding
> along the way.
>
> Regards,
> Valentin www.kovalenko.link
>
>
>>
>> Message: 4
>> Date: Mon, 19 Jul 2021 09:17:05 -0500
>> From: Gregg Wonderly <[email protected]>
>> To: Alex Otenko <[email protected]>
>> Cc: concurrency-interest <[email protected]>
>> Subject: Re: [concurrency-interest] Are there real use cases with the
>>         Java access modes?
>> Message-ID: <[email protected]>
>> Content-Type: text/plain; charset="utf-8"
>>
>> Here’s what I’ve repeatedly shown in these conversations in the past.
>> There is no explicit indication of Thread usage.  This is just a plain and
>> simple swing application that would be the kind of framework that the first
>> Swing application would be written using.  But even some of the things I am
>> doing here are a bit more than what I would expect to see in someones first
>> swing app.
>>
>> Gregg Wonderly
>>
>> import java.awt.*;
>> import java.awt.event.*;
>> import javax.swing.*;
>> import javax.swing.event.*;
>> import java.util.logging.*;
>>
>> public class Example2 extends JFrame {
>>
>>         JTextField tm;
>>         JButton btn;
>>         boolean done;
>>         public static void main( String args[] ) {
>>                 new Example2(args).open();
>>                 System.exit(0);
>>         }
>>
>>         public Example2(String args[] ) {
>>                 JPanel p = new JPanel();
>>                 p.setLayout( new FlowLayout() );
>>                 p.add( btn = new JButton("Press to Exit") );
>>                 p.add( tm = new JTextField(20) );
>>                 this.add(p);
>>                 btn.addActionListener( new ActionListener() {
>>                         public void actionPerformed( ActionEvent ev ) {
>>
>> Logger.getLogger(Example2.class.getName()).info("done...");
>>                                 done = true;
>>                         }
>>                 });
>>                 done = false;
>>         }
>>
>>         public void open() {
>>                 pack();
>>                 setLocationRelativeTo(null);
>>                 setVisible(true);
>>
>>                 // Does your JVM convert this statement to if( !done ) {
>> while( true ){ ...  } }?
>>                 while( !done ) {
>>                         tm.setText(""+new java.util.Date() );
>>                         try {
>>                                 Thread.sleep(500);
>>                         } catch( Exception ex ) {
>>                                 Logger.getLogger(Example2.class.getName())
>>                                         .log( Level.SEVERE,
>> ex.getMessage(), ex );
>>                         }
>>                 }
>>         }
>> }
>>
>> _______________________________________________
> Concurrency-interest mailing list
> [email protected]
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>
>
> _______________________________________________
> Concurrency-interest mailing list
> [email protected]
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>

_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest