Last year, I was feeling particularly sociable and decided to invite
my millions of followers over for a drink ;-) Initially I wanted to
call it "Coffee With Heinz", but Helene suggested alliteration, and so
"Heinz's Happy Hour" was born. It really was a lot of fun. Also a
lot of work, but that was my own fault for putting in so many hours to
make sure the setup was perfect and to edit and produce recordings
that I can feel proud of.

We had a blast with lots of laughter both in the webinars and in the
chat rooms. We covered a huge variety of information, with over
14 hours on the latest Java 9 tips and tricks, plus performance,
concurrency, memory management and a lot lot more. Altogether 183
little sections, with very little, if any, duplication. What I found
particularly fun was that quite a few Java experts joined us in the
Slack room. So we were thrown comments and questions by luminaries
such as Stuart Marks, Henri Tremblay, Kirk Pepperdine, Simone Bordet
and Andres Almiray. And I usually could not resist their bait,
resulting in some hilarious stuttering moments as I was stumped.

This time, no sales. No special offers. Instead, an invitation to
grab a drink and join me in watching the session 12 finale, looking at
the Inglorious History of the Common java.util.ArrayList. An entire
hour just looking at ArrayList. Imagine that! Head over to
https://tinyurl.com/yam6btn2but make sure you have a drink in your
hand first.

The free preview is going off on Tuesday the 12th Dec. So try find
time this weekend. I think it will be time well spent, if only to
watch me get suckered into trying to answer an impossible question
from Java 1.2.

Here is the entirety of what we achieved with this series, thank you
so much to all those that participated :-)

Episode 01 - Welcome to Webinar Series,
ConcurrentHashMap.computeIfAbsent(), IntelliJ IDEA Magic
1.1 Welcome to Heinz's Happy Hour Webinars (3:45)
1.2 5 Minute Guide to IntelliJ IDEA (7:17)
1.3 ConcurrentHashMap (3:17)
1.4 computeIfAbsent() Recursive Update (11:09)
1.5 Replacing computeIfAbsent() with putIfAbsent() (14:56)
1.6 Thread Contention in computeIfAbsent() (12:23)
1.7 Letting Threads Start Work at the Same Time (3:40)
1.8 Using volatile boolean to Start Threads Together (1:20)
1.9 Thanks and Until Next Time (2:21)
Episode 02 - Spliterator Deep Dive
2.1 Welcome to Spliterator Deep Dive (1:32)
2.2 Characteristics.ORDERED (4:52)
2.3 Characteristics.DISTINCT (2:40)
2.4 Characteristics.SORTED (1:23)
2.5 Characteristics.SIZED (4:16)
2.6 Characteristics.SUBSIZED (8:50)
2.7 Characteristics.NONNULL (3:03)
2.8 Characteristics of IdentityHashMap (7:16)
2.9 Characteristics.IMMUTABLE (3:40)
2.10 Characteristics.CONCURRENT (1:05)
2.11 Summary of Characteristics (0:16)
2.12 Implementing Spliterator Interface (0:57)
2.13 Our Own BasicArraySpliterator (2:29)
2.14 estimateSize() (1:58)
2.15 tryAdvance() (3:45)
2.16 trySplit() (19:32)
2.17 characteristics() (9:41)
2.18 forEachRemaining() (4:44)
2.19 getComparator() (0:55)
2.20 Performance of Splitting (6:58)
2.21 Questions (7:09)
Episode 03 - Turbo Charge CPU Utilization with Fork/Join and the
ManagedBlocker
3.1 Welcome to ManagedBlocker Talk (2:10)
3.2 Fibonacci Algorithms (4:51)
3.3 Dijkstra's Sum of Squares - Demo 1 (4:48)
3.4 Parallelize Our Algorithm - Demo 2 (3:37)
3.5 Parallelize BigInteger - Demo 3 (10:25)
3.6 Cache Results - Demo 4 (8:30)
3.7 Reserved Caching Scheme - Demo 5 (9:14)
3.8 ManagedBlocker - Demo 6 (10:40)
3.9 Questions (8:00)
Episode 04 - Generifying java.util.Observer
4.1 Welcome (0:24)
4.2 Observer Design Pattern (4:31)
4.3 java.util.Observer (2:26)
4.4 Generifying Observer (5:21)
4.5 Mutually Recursive Generics (3:56)
4.6 Linking Our Generified Observer to the WatchService (12:19)
4.7 Testing our DirectoryChangeWatcher (7:56)
4.8 Creating a ReactiveTableModel Watching a Directory (12:22)
4.9 Creating a GUI to View Directory Changes (3:37)
4.10 Fixing the Race Condition in our Table Model (7:13)
4.11 Why No One Uses java.util.Observer (1:20)
4.12 Observer Livelocks (2:33)
Episode 05 - Q&A with Heinz Kabutz and Maurice Naftalin
5.1 Welcome and Friendly Banter (5:09)
5.2 G1 GC Dynamic Log Viewer (1:54)
5.3 Default Methods in Java and Synchronized (6:11)
5.4 Memory Mapped File Performance (0:29)
5.5 forEach() Performance in Java 8 (2:36)
5.6 Explanation Why Interface Methods Cannot be Synchronized (2:20)
5.7 Java 9 Private Interface Methods (12:06)
5.8 Discussions About Optional in Java 8 and 9 (5:35)
5.9 Lambda Pitfalls (11:14)
5.10 Exceptions in Streams : Lambdas (1:47)
5.11 Compact in Java 8 JavaDocs (5:06)
Episode 06 - Java 9 java.util.* changes, Why you need to upgrade ASAP
6.1 Friendly Banter (1:34)
6.2 java.util.Arrays in Java 9 (11:40)
6.3 Enumeration to Iterator (4:48)
6.4 Observable Replaced by Flow (0:27)
6.5 Immutable Collections Java 9 (12:51)
6.6 Objects.* New Methods in Java 9 (5:32)
6.7 Optional in Java 9 (0:27)
6.8 Scanner in Java 9 (1:15)
6.9 Why You Should Migrate To Java 9 (9:12)
6.10 Question Time (13:00)
Episode 07 - Conference Speaking, StringSquasher with CharSequence
7.1 Conference Speaking (9:17)
7.2 Intrinsics (1:54)
7.3 Review of Immutable Lists in Java 9 (3:18)
7.4 Memory Hogs By Reynolds (2:23)
7.5 String deduplication (5:37)
7.6 Compact Strings in Java 9 (4:27)
7.7 StringSquasher (17:30)
7.8 Questions (10:01)
7.9 JCrete 2017 (3:31)
Episode 08 - Advanced G1GC Tuning Session with Kirk Pepperdine
8.1 Welcome to our Advanced G1GC Tuning Session with Kirk
Pepperdine (1:14)
8.2 Oracle's G1 Propaganda (3:09)
8.3 How Region Size is Calculated (2:09)
8.4 How Regions Are Allocated to Generations (3:29)
8.5 Visualizing Layout of the G1GC Heap (1:25)
8.6 Young Collection (1:30)
8.7 Old Collection - Concurrent Mark (1:46)
8.8 Time to Safe Point (TTSP) (2:51)
8.9 Collection Set (0:54)
8.10 Mark and Calculate Liveliness With
G1MixedGCLiveThresholdPercent (2:32)
8.11 Eligible Regions for Mixed Collections (1:06)
8.12 Humongous Allocations (6:31)
8.13 Allocators vs Collectors (3:02)
8.14 RSet Refinement Threads (1:08)
8.15 How To Get a GC Log (1:31)
8.16 Analysis of GC Log Using jClarity's Censum Tool (6:47)
8.17 Censum - Heap Graphs (4:09)
8.18 Censum - Memory Pool Sizing (3:22)
8.19 Censum - Allocation Rates (2:27)
8.20 Censum - Pause Times (1:13)
8.21 Censum - G1 Phases (3:37)
8.22 Censum - Tenuring Distribution Summary (0:43)
8.23 Tuning Recommendation Based on Censum Analysis (4:52)
8.24 Questions (5:27)
8.25 Question - Is G1 an alternative as from JDK 8 versus CMS? (6:51)
Episode 09 - Safely Shoot Yourself in the Foot with Java 9
9.1 Welcome
9.2 Project Jigsaw
9.3 Working Safely in Java
9.4 Evolution of Unsafe Usage - AtomicReferenceFieldUpdater
9.5 Evolution of Unsafe Usage - Unsafe in ConcurrentLinkedQueue
9.6 Introduction of VarHandle in Java 9
9.7 Unsafe Usage in Java 7,8,9
9.8 VarHandles Operations
9.9 Striped64 Tutorial
9.10 ThreadLocalRandom Evolution and Probe Field (3:23)
9.11 Accessing Thread Probe Field in Java 9 (1:08)
9.12 Changing Strings With VarHandle
9.13 Getting Rid of Warnings
9.14 MappedByteBuffer
9.15 JVisualVM Gone in Java 9
9.16 Marking Fields @Contended in Java 9
9.17 Java 9 Stream Changes
9.18 jshell For Scripting
9.19 Unix Style Scripting With jshell
9.20 Garbage Collection Changes in Java 9
9.21 Hacking BigInteger
9.22 Questions
Episode 10 - Little Known Java 9 Features
10.1 Welcome (0:13)
10.2 New Cleaner in Java 9 (4:01)
10.3 Finalizers in Java 9, reachabilityFence() (4:43)
10.4 Deprecations Going Forward (12:21)
10.5 Asynchronous Exceptions with Thread.stop() (1:39)
10.6 transferTo() and readAllBytes() (1:57)
10.7 Compiler Bug With Java StackOverFlow (4:06)
10.8 onSpinWait() (0:46)
10.9 Math.fma() (0:40)
10.10 System.Logger (0:17)
10.11 BigDecimal and BigInteger sqrt() (4:33)
10.12 ForkJoinPool New Constructor (0:21)
10.13 Desktop.moveToTrash() (2:53)
10.14 JAlba Unconference in Edinburgh, Scotland (2:15)
10.15 Questions (1:54)
Episode 11 - Refactoring to Java 8 Streams and Lambdas
11.1 Welcome and Chitter Chatter (7:35)
11.2 Refactoring Loops With Java 8 Streams (7:42)
11.3 Refactoring with stream(), map(), collect(), also Method
References (17:47)
11.4 ModelReader.getEntityCache(), distinct(), String joining (18:54)
11.5 EntityGroupUtil.getModelEntityFromRecords(), anyMatch()
(difficult) (16:39)
11.6 Comments and Questions (5:03)
Episode 12: The Inglorious History of the Common java.util.ArrayList
12.0 Friendly Banter (2:59)
12.1 Welcome to The Inglorious History of the Common
java.util.ArrayList (2:40)
12.2 Review of Java 1.2 ArrayList (1:00)
12.4 Serialization Deadlock Java 1.2 and 1.3 (3:47)
12.3 Java 1.2 -> 1.3 - Negative ArrayList Size (2:29)
12.5 Stuart Marks Challenge (5:35)
12.6 Java 1.3 -> 1.4 Arithmetic Overflow in int calculation (2:11)
12.7 Java 1.3 -> 1.4 - RandomAccess, bulk operations and
serialVersionUID (5:18)
12.8 Java 1.4 -> 1.5 - Generics (2:15)
12.9 Serialization - Why is elementData transient? (2:11)
12.10 Java 5 -> 6 (2:48)
12.11 toArray() returning wrong type of array (6:07)
12.12 Arrays.copyOf() (0:38)
12.13 Java 6 -> 7 - No-Args Constructor lazily initializing array (3:12)
12.14 Java 7 Bulk Methods slightly improved (1:11)
12.15 Java 7 Serialization (1:29)
12.16 Java 7 -> 8 (0:31)
12.17 Computational time complexity of removeIf() (1:22)
12.18 List.sort() with exceptions (2:25)
12.19 Java 8 -> Java 9 - Martin Thompson style coding (2:29)
12.20 Thank you! (0:54)

Kind regards from Crete

Heinz

If you no longer wish to receive our emails, click the link below:

https://iw127.infusionsoft.com/app/optOut/8/a6ca3d5100f0d052/5488907/a37132b50592e308

Cretesoft Limited 77 Strovolos Ave Strovolos, Lefkosia 2018 Cyprus