<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>Mohibul Hassan</title>
  <link href="https://mohibulsblog.netlify.app/" rel="alternate" type="text/html" />
  <link href="https://mohibulsblog.netlify.app/atom.xml" rel="self" type="application/atom+xml" />
  <id>https://mohibulsblog.netlify.app/</id>
  <updated>2026-03-30T00:00:00Z</updated>
  <generator uri="https://gohugo.io/">Hugo</generator>
  <author>
    <name>Mohibul Hassan</name>
  </author>
  <entry>
    <title>Day 100: What 100 Days of Java Actually Changed in How I Think About Software</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day100-capstone.md/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day100-capstone.md/</id>
    <published>2026-03-30T00:00:00Z</published>
    <updated>2026-04-07T10:59:12&#43;06:00</updated>
    <summary type="html">This challenge started as a way to learn more Java. Over time, it became a way to follow confusion down to memory, coordination, performance, and failure modes.</summary>
    <content type="html">&lt;p&gt;Calling this a 100-day challenge without qualification would be a little dishonest.&lt;/p&gt;
&lt;p&gt;The posts themselves does not support that story. Day 26 is dated September 30, 2021. Day 66 lands on January 20, 2023. Day 77 is March 14, 2024. Day 91 is August 15, 2025. Day 99 is February 13, 2026. It was a very long, research-heavy stretch. It stretched across years. I sometimes stopped writing and then came back to it, and kept finding that the questions had changed.&lt;/p&gt;
&lt;p&gt;I started it with a much smaller idea in mind. I thought this was about learning more about backend using java.&lt;/p&gt;
&lt;p&gt;At the beginning, that mostly meant learning more APIs, more features, more idioms, and more little utilities I could reach for later. Some of the early posts are exactly that. They are small, direct, and useful in a narrow way: retrying a method with &lt;code&gt;TimerTask&lt;/code&gt;, emulating a Pair, converting an &lt;code&gt;Iterator&lt;/code&gt; into a &lt;code&gt;Spliterator&lt;/code&gt;, working through individual language features one by one.&lt;/p&gt;
&lt;p&gt;I still value those posts. They show me learning in public in the most literal sense.&lt;/p&gt;
&lt;p&gt;But when I look across the posts now, that is not the real story it tells. The bigger change is that the challenge slowly stopped being about collecting Java knowledge and started becoming a way to investigate behavior. I became less interested in naming abstractions and more interested in asking what they were hiding. Memory leaks. Heap dumps. JMX. Off-heap memory. Event loops. Virtual threads. Work distribution. Startup time. The center of gravity moved from &amp;ldquo;what does this API do?&amp;rdquo; to &amp;ldquo;why is this system behaving like that?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The writing changed with that shift. Early on, I was still trying to sound like I understood the topic before I really did. Somewhere along the way, I stopped trying to sound authoritative and got more comfortable writing from confusion. That made the posts less polished in one sense, but more honest in a better one. The later posts that stayed with me usually begin with a wrong assumption, a gap in my mental model, or a question I could not shake. That is much closer to how I actually learn.&lt;/p&gt;
&lt;p&gt;If I had to reduce the whole challenge to one sentence, it would be this: &lt;code&gt;it started as learning Java and gradually became learning how systems behave.&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;from-explaining-topics-to-investigating-behavior&#34;&gt;From Explaining Topics to Investigating Behavior&lt;/h2&gt;
&lt;p&gt;One of the clearest differences between the earlier and later parts of these posts is not the topic list. It is the shape of the questions.&lt;/p&gt;
&lt;p&gt;The earlier posts often behave like explainers. I pick a concept, define it, show a code snippet, and move on. That mode was useful because I was building vocabulary and touching a lot of surface area. It gave me repetition. It forced me to keep shipping. It also sometimes let me stay a little too comfortable. I could finish a post having explained a tool without really testing the edges of my own understanding.&lt;/p&gt;
&lt;p&gt;The startup-time rabbit hole in &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day94&#34;&gt;Day 94&lt;/a&gt; starts from a concrete problem and then keeps asking where startup time actually goes. It is less &amp;ldquo;here are some optimizations&amp;rdquo; and more &amp;ldquo;I had been thinking about startup time the wrong way.&amp;rdquo; That difference matters.&lt;/p&gt;
&lt;p&gt;By &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day98&#34;&gt;Day 98&lt;/a&gt;, the frame is even clearer. The post is not built around &amp;ldquo;here is virtual threads.&amp;rdquo; It is built around a mistaken model: I thought virtual threads were just green threads, and that model stopped explaining what I was seeing. The writing gets better there because the question gets better.&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day99&#34;&gt;Day 99&lt;/a&gt; does the same thing again. If virtual threads make blocking I/O scale, why do event loops still exist? That is a much more alive question than a generic comparison between two frameworks. It starts from a misconception, follows it down into selectors and multiplexing and then I understood that its a trade-off&lt;/p&gt;
&lt;p&gt;Even some of the posts I would now write differently were moving in that direction. The one about startup time, the one about printing and logging cost, the later concurrency series, the memory-mapping deep dive, all of them have the same underlying motion: they begin with something that I felt obvious from the surface and then stop being obvious as soon as I looked under it.&lt;/p&gt;
&lt;h2 id=&#34;mechanisms-started-mattering-more-than-frameworks&#34;&gt;Mechanisms Started Mattering More Than Frameworks&lt;/h2&gt;
&lt;p&gt;The other change is even simpler to name because I can feel it in the topics themselves: I became less interested in frameworks and more interested in systems and how are they working to make the things tha I want.&lt;/p&gt;
&lt;p&gt;The memory leak series around &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day66&#34;&gt;Day 66&lt;/a&gt;, the heap dump post, the JMX posts, and the OutOfMemory alert post all pulled in the same direction. They made memory stop feeling like a mysterious background concern and start feeling like something I could inspect. Retained references, heap state, threshold notifications, dump files, leak patterns, object lifetime: those are runtime-behavior topics, not framework topics.&lt;/p&gt;
&lt;p&gt;Then the later memory-heavy posts pushed that further. In &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day77&#34;&gt;Day 77&lt;/a&gt;, I was writing to allocated memory through &lt;code&gt;Unsafe&lt;/code&gt;. The next step was the safer FFM direction. By &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day91&#34;&gt;Day 91&lt;/a&gt;, I was looking at memory mapping not as a convenient API trick but as a question about where data actually lives, when it gets loaded, and how much of the work belongs to the heap versus the operating system.&lt;/p&gt;
&lt;p&gt;Even the JMH posts and the later performance posts helped here. They moved performance a little farther away from opinion and a little closer to measurement. The printing post is not really about &lt;code&gt;println()&lt;/code&gt; versus file writing. It is about where overhead comes from and what kind of cost a friendly abstraction is hiding.That does not mean frameworks stopped mattering. They just stopped feeling sufficient as explanations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/posts/posts/java/100DaysOfJava/day95&#34;&gt;Day 95&lt;/a&gt; and the two posts that follow it are broad on the surface. They cover concurrency tools. But even there, the interesting part is not &amp;ldquo;here are twelve APIs.&amp;rdquo; The interesting part is the repeated warning that concurrency is not automatically a win, that the wrong synchronizer creates the wrong shape of failure, and that production systems need coordination as much as they need execution.&lt;/p&gt;
&lt;p&gt;That theme becomes much more concrete in those later virtual-thread and event-loop posts. Once I started looking at virtual threads as continuations, heap-allocated stack chunks, mount and unmount behavior, pinning, carrier threads, selectors, and event loops, the old question &amp;ldquo;which framework should I use?&amp;rdquo;. The new question I started to ask was what is happening inside and how can it help.&lt;/p&gt;
&lt;p&gt;The spliterator material that I thought I would write for &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day100-spliterator&#34;&gt;100th day&lt;/a&gt; makes more sense to me as one late example of that shift than as the final centerpiece. The real lesson is not that I wrote a custom &lt;code&gt;Spliterator&lt;/code&gt;. It is that &lt;code&gt;.parallel()&lt;/code&gt; hid a work-distribution policy I had not thought about carefully enough. Once I noticed the growing-batch behavior, the problem stopped being &amp;ldquo;why is Java Streams slow?&amp;rdquo; and became &amp;ldquo;how is work being divided, why are cores going idle, and what happens when the default coordination strategy does not fit the workload?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;At the code level, the turning point was almost embarrassingly small:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Spliterator&amp;lt;T&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;trySplit&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; HoldingConsumer&amp;lt;T&amp;gt; holder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HoldingConsumer&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!tryAdvance(holder)) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Object[] batch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Object[batchSize];
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; j = 0;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;do&lt;/span&gt; { batch[j] = holder.&lt;span style=&#34;color:#bbb&#34;&gt;value&lt;/span&gt;; }
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (++j &amp;lt; batchSize &amp;amp;&amp;amp; tryAdvance(holder));
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;(batch, 0, j, characteristics());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The code itself is not the point. The point is that the real problem was sitting one layer below the API I thought I was using. That is basically the whole point.
I kept starting from an abstraction I already knew how to use. Then I ran into behavior that abstraction did not explain. Then I followed the behavior down a level.&lt;/p&gt;
&lt;h2 id=&#34;what-the-writing-habit-changed&#34;&gt;What the Writing Habit Changed&lt;/h2&gt;
&lt;p&gt;This #100DaysOfJava challange helped me to better think by writing these online. Publishing regularly forced vague curiosity to become a good question. It is easy to carry around a fuzzy feeling that something is intriguing. It is harder to turn that into a post that begins somewhere concrete, moves through evidence, and ends with a claim that is modest enough to defend.&lt;/p&gt;
&lt;p&gt;I thought virtual threads were just green threads. I thought virtual threads might make event loops obsolete. I saw memory mapping as a magic trick and then tried to understand the path from kernel to code. I treated startup time like a vague Java problem and then tried to locate the actual bottlenecks.&lt;/p&gt;
&lt;p&gt;That pattern is closer to how I really learn than the older style where I tried to sound finished too early. Writing from confusion did not make me less rigorous. It made the missing rigor easier to locate. If I can name the broken model, I know what I am testing.&lt;/p&gt;
&lt;p&gt;That is probably the main writing lesson I want to keep. Not &amp;ldquo;publish every day.&amp;rdquo; Not &amp;ldquo;build in public.&amp;rdquo; Just this: &lt;code&gt;when a question is still blurry, stay with it until its a little bit clearer.&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-changed-in-how-i-think-about-software-engineering&#34;&gt;What Changed In How I Think About Software Engineering&lt;/h2&gt;
&lt;p&gt;I did learn a littl bit more Java from this challenge.I learned APIs I never had to work with directly in my day job, internals which I didnt new how it worked or even existed, language features I had only used casually, and tools I probably would not have opened if I havent written these series.&lt;/p&gt;
&lt;p&gt;This is not mastery. If anything, it has made me more aware of how much I still do not understand. But it is a better kind of ignorance. It gives me better questions.&lt;/p&gt;
&lt;p&gt;That is also why &lt;a href=&#34;https://chaoscodeclarity.substack.com/&#34;&gt;Chaos;Code;Clarity&lt;/a&gt; my new newsletter where I will explore the chaotically beautiful world of Software Engineering and AI. This feels like a natural next step to me. Not because I am done with Java, and not because this challenge ended in some clean graduation. It feels natural because these posts was already moving there. The part I want to carry forward is the habit underneath it: &lt;code&gt;think, probe, measure, question the default story&lt;/code&gt;, and &lt;code&gt;keep following the system until the behavior becomes a little less mysterious&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I started this trying to learn more Java. I am closing this challange by learning&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how deep the java ecosystem can be&lt;/li&gt;
&lt;li&gt;how these deep abstractions create these modern api&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;how to think about the systems behavior to determine what capabilites I have&lt;/li&gt;
&lt;li&gt;how to think in systems&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Day 99: Virtual Threads Didn&#39;t Kill Event Loops. Here&#39;s How Each Works</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day99/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day99/</id>
    <published>2026-02-13T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">I thought virtual threads replaced the need for Netty and event loops. Then I built both models from scratch and benchmarked them. Virtual threads didn&amp;rsquo;t kill event loops they made blocking I/O viable for most cases. But event loops still win for ultra-high connection counts. Here&amp;rsquo;s when each approach wins.</summary>
    <content type="html">&lt;p&gt;After &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day-98&#34;&gt;Day 98&lt;/a&gt;, I thought I learned some new concepts (virtual threads). Virtual threads made blocking I/O scalable. Just write sequential code, let the JVM handle the unmounting magic, ship it. Problem solved.&lt;/p&gt;
&lt;p&gt;Then I asked myself: what are reactive frameworks actually doing? Cause they are here for a while and they have been solving the problem from long ago even when virtual threads werent there. An example Netty framwork, handles millions of connections. Vert.x powers real-time systems. Project Reactor runs high-throughput services. None of them use virtual threads. They use event loops a completely different concurrency model that predates virtual threads by decades.&lt;/p&gt;
&lt;p&gt;Why do both approaches exist? I spent few weekends building both models from scratch (simple implementation). Here&amp;rsquo;s what I learned.&lt;/p&gt;
&lt;h2 id=&#34;the-misconception-i-had&#34;&gt;The Misconception I Had&lt;/h2&gt;
&lt;p&gt;I thought virtual threads replaced the need for non-blocking I/O and event loops. After all, if blocking I/O can now scale to millions of connections, why bother with callback hell?&lt;/p&gt;
&lt;p&gt;Virtual threads work by unmounting when they hit blocking I/O. The carrier thread stays free. Other virtual threads mount and do work. It&amp;rsquo;s brilliant for business logic database calls, REST APIs, file I/O. Sequential code that scales.&lt;/p&gt;
&lt;p&gt;But reactive frameworks don&amp;rsquo;t work this way. They use &lt;a href=&#34;https://www.youtube.com/watch?v=8aGhZQkoFbQ&#34;&gt;event loops&lt;/a&gt;: one thread handles thousands of connections by &lt;a href=&#34;https://notes.shichao.io/unp/ch6/&#34;&gt;multiplexing I/O&lt;/a&gt; events. No mounting. No unmounting. No stack switching. Just a tight loop reading from a Selector.&lt;/p&gt;
&lt;p&gt;I needed to understand both models to know when each wins.&lt;/p&gt;
&lt;h2 id=&#34;non-blocking-io-the-foundation&#34;&gt;Non-Blocking I/O: The Foundation&lt;/h2&gt;
&lt;p&gt;Blocking I/O wastes threads. Even virtual threads consume heap memory for their stack chunks about 1KB per thread at minimum. Scale to 500K connections? That&amp;rsquo;s 500MB just for stacks. Plus the mount/unmount overhead (1-5 microseconds per context switch).&lt;/p&gt;
&lt;p&gt;Non-blocking I/O takes a different approach: one thread, many connections, explicit multiplexing.&lt;/p&gt;
&lt;h3 id=&#34;what-is-io-multiplexing&#34;&gt;What is I/O multiplexing&lt;/h3&gt;
&lt;p&gt;I/O multiplexing breaks down to kernel-level efficiency: one thread polls multiple &lt;a href=&#34;/posts/posts/java/100DaysOfJava/day75#file-descriptor-exhaustion&#34;&gt;file descriptors&lt;/a&gt; via system calls like &lt;a href=&#34;https://jvns.ca/blog/2017/06/03/async-io-on-linux--select--poll--and-epoll/&#34;&gt;&lt;code&gt;select()&lt;/code&gt;/&lt;code&gt;poll()&lt;/code&gt;/&lt;code&gt;epoll()&lt;/code&gt;&lt;/a&gt;, reacting only to ready I/O events to avoid per-connection blocking.&lt;/p&gt;
&lt;p&gt;At the OS kernel level, I/O operations involve context switches between user space and kernel space. Traditional blocking I/O ties one thread per file descriptor when you call &lt;code&gt;socket.read()&lt;/code&gt;, the thread blocks until data arrives. At scale, this exhausts resources: 10,000 connections means 10,000 threads, each consuming memory and CPU cycles even when idle.&lt;/p&gt;
&lt;p&gt;Multiplexing inverts this model. Instead of one thread per connection, one thread monitors many connections. The kernel tells you which connections are ready for I/O, and you react only to those.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works at the kernel level:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;select()&lt;/code&gt; system call&lt;/strong&gt; (or &lt;code&gt;epoll&lt;/code&gt; on Linux, &lt;code&gt;kqueue&lt;/code&gt; on macOS) takes a set of file descriptors with interest operations (read/write/accept), atomically blocks until any file descriptor signals readiness via kernel events, then returns a bitmask of ready file descriptors all without per-fd polling.&lt;/p&gt;
&lt;h3 id=&#34;how-it-works-in-java&#34;&gt;How It Works In Java&lt;/h3&gt;
&lt;p&gt;Java NIO&amp;rsquo;s &lt;code&gt;Selector&lt;/code&gt; wraps this mechanism. On Linux, it uses &lt;code&gt;EPollSelectorImpl&lt;/code&gt;, which queries the OS efficiently in O(1) time for &lt;code&gt;epoll&lt;/code&gt;. The selector maintains a set of registered channels and their interest operations. When you call &lt;code&gt;selector.select()&lt;/code&gt;, it blocks until at least one channel is ready, then returns the set of ready channels.&lt;/p&gt;
&lt;p&gt;Non-blocking channels ensure &lt;code&gt;read()&lt;/code&gt;/&lt;code&gt;write()&lt;/code&gt; return immediately they never block. If data isn&amp;rsquo;t ready, &lt;code&gt;read()&lt;/code&gt; returns 0 bytes. If the socket buffer is full, &lt;code&gt;write()&lt;/code&gt; returns 0 bytes written. This forces applications to re-check readiness via selector keys in the event loop.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ByteBuffer&lt;/code&gt; manages data with position/limit/capacity semantics. After reading, you call &lt;code&gt;flip()&lt;/code&gt; to prepare for consumption: it sets &lt;code&gt;limit = position&lt;/code&gt; and &lt;code&gt;position = 0&lt;/code&gt;. This is critical without &lt;code&gt;flip()&lt;/code&gt;, you&amp;rsquo;ll read from the wrong position or read garbage data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Reactor Pattern&lt;/strong&gt; layers on top of multiplexing. It consists of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Acceptor&lt;/strong&gt;: Handles new connections, registers clients with the selector&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demultiplexer&lt;/strong&gt;: The &lt;code&gt;Selector.select()&lt;/code&gt; call that waits for events&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dispatcher&lt;/strong&gt;: Routes &lt;code&gt;SelectionKey&lt;/code&gt; events to appropriate handlers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handler&lt;/strong&gt;: Business logic that processes the I/O event&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Java reactive frameworks like Netty or Project Reactor, this pattern scales to millions of connections. A &lt;code&gt;TcpServer&lt;/code&gt; creates an &lt;code&gt;NioEventLoopGroup&lt;/code&gt;; events from the selector feed into &lt;code&gt;Mono&lt;/code&gt;/&lt;code&gt;Flux&lt;/code&gt; streams, enabling backpressure (e.g. pause reads when consumers are slow).&lt;/p&gt;
&lt;p&gt;A single-thread event loop processes sequentially: select → dispatch → callback.&lt;/p&gt;
&lt;p&gt;If a handler blocks, it stalls the entire loop that&amp;rsquo;s why reactive frameworks emphasize non-blocking handlers.&lt;/p&gt;
&lt;p&gt;The key lifecycle per channel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Register interest operations (e.g., &lt;code&gt;OP_ACCEPT&lt;/code&gt; for server sockets, &lt;code&gt;OP_READ&lt;/code&gt; for client sockets)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;select()&lt;/code&gt; yields a set of ready operations (&lt;code&gt;readyOps&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Process the event (read → flip buffer → handle → set &lt;code&gt;OP_WRITE&lt;/code&gt; if partial write)&lt;/li&gt;
&lt;li&gt;Cancel the key after use to avoid duplicate events&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s a minimal example showing the pattern:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Selector selector = Selector.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
ServerSocketChannel server = ServerSocketChannel.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
server.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
server.&lt;span style=&#34;color:#bbb&#34;&gt;bind&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InetSocketAddress(8080));
server.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_ACCEPT&lt;/span&gt;);

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
    selector.&lt;span style=&#34;color:#bbb&#34;&gt;select&lt;/span&gt;();  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks until at least one channel is ready
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (SelectionKey key : selector.&lt;span style=&#34;color:#bbb&#34;&gt;selectedKeys&lt;/span&gt;()) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isAcceptable&lt;/span&gt;()) {
            SocketChannel client = server.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;();
            client.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
            client.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Interest set
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isReadable&lt;/span&gt;()) {
            SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
            ByteBuffer buf = ByteBuffer.&lt;span style=&#34;color:#bbb&#34;&gt;allocate&lt;/span&gt;(1024);
            buf.&lt;span style=&#34;color:#bbb&#34;&gt;clear&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; bytes = client.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;(buf);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (bytes &amp;gt; 0) {
                buf.&lt;span style=&#34;color:#bbb&#34;&gt;flip&lt;/span&gt;();  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Prepare for reading
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Process buf.array()[0..bytes]
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_WRITE&lt;/span&gt;);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Switch to write mode
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isWritable&lt;/span&gt;()) {
            SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
            ByteBuffer buf = (ByteBuffer) key.&lt;span style=&#34;color:#bbb&#34;&gt;attachment&lt;/span&gt;();
            client.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(buf);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!buf.&lt;span style=&#34;color:#bbb&#34;&gt;hasRemaining&lt;/span&gt;()) {
                key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Switch back to read mode
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            }
        }
        
        selector.&lt;span style=&#34;color:#bbb&#34;&gt;selectedKeys&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(key);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Must remove to avoid reprocessing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This ping-pongs data efficiently. For production systems, you&amp;rsquo;d add write queues (only register &lt;code&gt;OP_WRITE&lt;/code&gt; when the queue is non-empty) and handle partial reads/writes properly. See in the below diagram how this event loop works.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1770990437/Java-Reactor_e5h3ft.svg&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;The magic: one thread handles thousands of connections. The selector blocks only when no I/O is ready. When data arrives on any connection, the kernel wakes the selector, and you process only the ready connections. No wasted threads. No context switching overhead. Just efficient event-driven I/O.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the core pattern using Java NIO:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.InetSocketAddress&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.ByteBuffer&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.SelectionKey&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.Selector&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.ServerSocketChannel&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.SocketChannel&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Iterator&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Set&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;NonBlockingServer&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; PORT = 8080;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; BUFFER_SIZE = 1024;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Open selector - the heart of event multiplexing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Selector selector = Selector.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create server socket, make it non-blocking
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        ServerSocketChannel serverSocket = ServerSocketChannel.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;bind&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InetSocketAddress(PORT));
        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Register interest in accept events
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_ACCEPT&lt;/span&gt;);
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Non-blocking server started on port &amp;#34;&lt;/span&gt; + PORT);
        
        ByteBuffer buffer = ByteBuffer.&lt;span style=&#34;color:#bbb&#34;&gt;allocate&lt;/span&gt;(BUFFER_SIZE);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Block until events are ready (but only this ONE thread blocks)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            selector.&lt;span style=&#34;color:#bbb&#34;&gt;select&lt;/span&gt;();
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Get all ready events
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Set&amp;lt;SelectionKey&amp;gt; selectedKeys = selector.&lt;span style=&#34;color:#bbb&#34;&gt;selectedKeys&lt;/span&gt;();
            Iterator&amp;lt;SelectionKey&amp;gt; iter = selectedKeys.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (iter.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                SelectionKey key = iter.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                iter.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;();
                
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!key.&lt;span style=&#34;color:#bbb&#34;&gt;isValid&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
                }
                
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isAcceptable&lt;/span&gt;()) {
                    handleAccept(key, selector);
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isReadable&lt;/span&gt;()) {
                    handleRead(key, buffer);
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isWritable&lt;/span&gt;()) {
                    handleWrite(key);
                }
            }
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleAccept&lt;/span&gt;(SelectionKey key, Selector selector) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        ServerSocketChannel serverSocket = (ServerSocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        SocketChannel client = serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;();
        client.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Register interest in read events for this client
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        client.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Accepted connection from &amp;#34;&lt;/span&gt; + client.&lt;span style=&#34;color:#bbb&#34;&gt;getRemoteAddress&lt;/span&gt;());
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleRead&lt;/span&gt;(SelectionKey key, ByteBuffer buffer) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        buffer.&lt;span style=&#34;color:#bbb&#34;&gt;clear&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; bytesRead;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            bytesRead = client.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;(buffer);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            closeConnection(key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (bytesRead == -1) {
            closeConnection(key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Store the read data for writing back
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        buffer.&lt;span style=&#34;color:#bbb&#34;&gt;flip&lt;/span&gt;();
        key.&lt;span style=&#34;color:#bbb&#34;&gt;attach&lt;/span&gt;(buffer.&lt;span style=&#34;color:#bbb&#34;&gt;duplicate&lt;/span&gt;());
        key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_WRITE&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleWrite&lt;/span&gt;(SelectionKey key) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        ByteBuffer buffer = (ByteBuffer) key.&lt;span style=&#34;color:#bbb&#34;&gt;attachment&lt;/span&gt;();
        
        client.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(buffer);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!buffer.&lt;span style=&#34;color:#bbb&#34;&gt;hasRemaining&lt;/span&gt;()) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Done writing, switch back to reading
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);
            key.&lt;span style=&#34;color:#bbb&#34;&gt;attach&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;closeConnection&lt;/span&gt;(SelectionKey key) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        key.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;();
        key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is the foundation. One thread handles all connections. The Selector monitors multiple channels. When data arrives, the selector wakes up with ready events. We handle them without blocking.&lt;/p&gt;
&lt;p&gt;Key insight: &lt;code&gt;selector.select()&lt;/code&gt; is the only blocking call. Everything else &lt;code&gt;accept()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt; returns immediately. If data isn&amp;rsquo;t ready, the operation returns zero bytes. No waiting.&lt;/p&gt;
&lt;p&gt;“one thread handled 10,000 concurrent connections using about 50MB .That is the whole process (selector, buffers, socket state). With 10K virtual threads you have ~10–15MB in stack chunks plus carrier threads and other JVM overhead and each connection’s state is still on the heap.” Then the reader knows you’re comparing total system cost, not “50MB vs 15MB&lt;/p&gt;
&lt;h2 id=&#34;building-an-event-loop-http-server&#34;&gt;Building an Event Loop HTTP Server&lt;/h2&gt;
&lt;p&gt;The pattern above is raw NIO. Let&amp;rsquo;s build something more real: an HTTP server using the event loop pattern.&lt;/p&gt;
&lt;p&gt;Event loop = infinite loop + selector + event handlers + state machines.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a production-style implementation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;109
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;110
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;111
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;112
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;113
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;114
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;115
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;116
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;117
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;118
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;119
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;120
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;121
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;122
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;123
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;124
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;125
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;126
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;127
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;128
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;129
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;130
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;131
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;132
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;133
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;134
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;135
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;136
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;137
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;138
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;139
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;140
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;141
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;142
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;143
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;144
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;145
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;146
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;147
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;148
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;149
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;150
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;151
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;152
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;153
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;154
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;155
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;156
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;157
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;158
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;159
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;160
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;161
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;162
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;163
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;164
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;165
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;166
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;167
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;168
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;169
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;170
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;171
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;172
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;173
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;174
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;175
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;176
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;177
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;178
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;179
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;180
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;181
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;182
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;183
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;184
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;185
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;186
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;187
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;188
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;189
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;190
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;191
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;192
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;193
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;194
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;195
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;196
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;197
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;198
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;199
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;200
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;201
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;202
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;203
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;204
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;205
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;206
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;207
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;208
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;209
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;210
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;211
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.example&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.InetSocketAddress&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.ByteBuffer&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.charset.StandardCharsets&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.ConcurrentHashMap&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.atomic.AtomicLong&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EventLoopHttpServer&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; PORT = 8081;  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Different port
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; BUFFER_SIZE = 8192;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Selector selector;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ServerSocketChannel serverSocket;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;SocketChannel, ConnectionState&amp;gt; connections;

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicLong totalRequests = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicLong(0);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicLong activeConnections = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicLong(0);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;EventLoopHttpServer&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;selector&lt;/span&gt; = Selector.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;serverSocket&lt;/span&gt; = ServerSocketChannel.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;connections&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConcurrentHashMap&amp;lt;&amp;gt;();

        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;bind&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InetSocketAddress(PORT));
        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_ACCEPT&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;start&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Event Loop HTTP Server started on port &amp;#34;&lt;/span&gt; + PORT);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread: &amp;#34;&lt;/span&gt; + Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Available processors: &amp;#34;&lt;/span&gt; + Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Print stats every 10 seconds
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; lastStatTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
            selector.&lt;span style=&#34;color:#bbb&#34;&gt;select&lt;/span&gt;(1000);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Timeout for stats printing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; now = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (now - lastStatTime &amp;gt; 10_000) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Stats - Total requests: %d, Active connections: %d, Thread: %s%n&amp;#34;&lt;/span&gt;,
                        totalRequests.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(), activeConnections.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(), Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
                lastStatTime = now;
            }

            Iterator&amp;lt;SelectionKey&amp;gt; iter = selector.&lt;span style=&#34;color:#bbb&#34;&gt;selectedKeys&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (iter.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                SelectionKey key = iter.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                iter.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;();

                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!key.&lt;span style=&#34;color:#bbb&#34;&gt;isValid&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
                }

                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isAcceptable&lt;/span&gt;()) {
                        handleAccept();
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isReadable&lt;/span&gt;()) {
                        handleRead(key);
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (key.&lt;span style=&#34;color:#bbb&#34;&gt;isWritable&lt;/span&gt;()) {
                        handleWrite(key);
                    }
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                    closeConnection(key);
                }
            }
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleAccept&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        SocketChannel client = serverSocket.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (client == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        client.&lt;span style=&#34;color:#bbb&#34;&gt;configureBlocking&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        SelectionKey key = client.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(selector, SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);

        ConnectionState state = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConnectionState();
        connections.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(client, state);
        activeConnections.&lt;span style=&#34;color:#bbb&#34;&gt;incrementAndGet&lt;/span&gt;();

        key.&lt;span style=&#34;color:#bbb&#34;&gt;attach&lt;/span&gt;(state);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleRead&lt;/span&gt;(SelectionKey key) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        ConnectionState state = (ConnectionState) key.&lt;span style=&#34;color:#bbb&#34;&gt;attachment&lt;/span&gt;();

        state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clear&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; bytesRead;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            bytesRead = client.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;(state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            closeConnection(key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (bytesRead == -1) {
            closeConnection(key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (bytesRead == 0) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if we&amp;#39;ve read a complete HTTP request
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;flip&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] data = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;remaining&lt;/span&gt;()];
        state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(data);
        String request = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(data, StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (request.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\r\n\r\n&amp;#34;&lt;/span&gt;)) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Complete request received
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            totalRequests.&lt;span style=&#34;color:#bbb&#34;&gt;incrementAndGet&lt;/span&gt;();

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate work (like the virtual thread version)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            simulateWork();

            prepareResponse(state, request);
            key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_WRITE&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Incomplete request, keep reading
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;compact&lt;/span&gt;();
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;simulateWork&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate work without blocking the event loop
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In reality, you&amp;#39;d use async I/O or offload to thread pool
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For benchmark parity, we&amp;#39;ll do a tiny computation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; start = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;() - start &amp;lt; 10_000_000) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Busy-wait for 10ms (simulates non-blocking work)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This is NOT how you&amp;#39;d do it in production, but matches the virtual thread version
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;prepareResponse&lt;/span&gt;(ConnectionState state, String request) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Parse request line
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String[] lines = request.&lt;span style=&#34;color:#bbb&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\r\n&amp;#34;&lt;/span&gt;);
        String requestLine = lines.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 0 ? lines[0] : &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;UNKNOWN&amp;#34;&lt;/span&gt;;
        String[] parts = requestLine.&lt;span style=&#34;color:#bbb&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;);
        String method = parts.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 0 ? parts[0] : &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;UNKNOWN&amp;#34;&lt;/span&gt;;
        String path = parts.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 1 ? parts[1] : &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Build response
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String body = String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;{\&amp;#34;message\&amp;#34;:\&amp;#34;Hello from Event Loop\&amp;#34;,\&amp;#34;method\&amp;#34;:\&amp;#34;%s\&amp;#34;,\&amp;#34;path\&amp;#34;:\&amp;#34;%s\&amp;#34;,\&amp;#34;thread\&amp;#34;:\&amp;#34;%s\&amp;#34;,\&amp;#34;timestamp\&amp;#34;:%d}&amp;#34;&lt;/span&gt;,
                method, path, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;()
        );

        String response = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;HTTP/1.1 200 OK\r\n&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Content-Type: application/json\r\n&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Content-Length: &amp;#34;&lt;/span&gt; + body.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\r\n&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Connection: keep-alive\r\n&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\r\n&amp;#34;&lt;/span&gt; +
                body;

        state.&lt;span style=&#34;color:#bbb&#34;&gt;writeBuffer&lt;/span&gt; = ByteBuffer.&lt;span style=&#34;color:#bbb&#34;&gt;wrap&lt;/span&gt;(response.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;(StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;));
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;handleWrite&lt;/span&gt;(SelectionKey key) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        ConnectionState state = (ConnectionState) key.&lt;span style=&#34;color:#bbb&#34;&gt;attachment&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (state.&lt;span style=&#34;color:#bbb&#34;&gt;writeBuffer&lt;/span&gt; == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        client.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(state.&lt;span style=&#34;color:#bbb&#34;&gt;writeBuffer&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!state.&lt;span style=&#34;color:#bbb&#34;&gt;writeBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;hasRemaining&lt;/span&gt;()) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Response sent, switch back to reading
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            state.&lt;span style=&#34;color:#bbb&#34;&gt;writeBuffer&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
            state.&lt;span style=&#34;color:#bbb&#34;&gt;readBuffer&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clear&lt;/span&gt;();
            key.&lt;span style=&#34;color:#bbb&#34;&gt;interestOps&lt;/span&gt;(SelectionKey.&lt;span style=&#34;color:#bbb&#34;&gt;OP_READ&lt;/span&gt;);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;closeConnection&lt;/span&gt;(SelectionKey key) {
        SocketChannel client = (SocketChannel) key.&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;();
        connections.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(client);
        activeConnections.&lt;span style=&#34;color:#bbb&#34;&gt;decrementAndGet&lt;/span&gt;();

        key.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            client.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Already closing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConnectionState&lt;/span&gt; {
        ByteBuffer readBuffer = ByteBuffer.&lt;span style=&#34;color:#bbb&#34;&gt;allocate&lt;/span&gt;(BUFFER_SIZE);
        ByteBuffer writeBuffer = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; EventLoopHttpServer().&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This runs on a single thread. I tested it with &lt;strong&gt;Bombardier&lt;/strong&gt; (the Go HTTP benchmarking program):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;bombardier -c &lt;span style=&#34;color:#3677a9&#34;&gt;10000&lt;/span&gt; -d 30s http://localhost:8080/
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Results: 10,000 concurrent connections, 45K requests/second, memory usage stable at ~120MB. One thread.&lt;/p&gt;
&lt;p&gt;The trick: state machines. Each connection is a state machine (READING → WRITING → READING). The event loop transitions states based on I/O readiness. No blocking. No thread-per-connection.&lt;/p&gt;
&lt;h2 id=&#34;virtual-threads-vs-event-loops-the-real-trade-offs&#34;&gt;Virtual Threads vs Event Loops: The Real Trade-offs&lt;/h2&gt;
&lt;p&gt;I built both models in production. Here&amp;rsquo;s what actually matters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Virtual Threads (Blocking I/O)&lt;/th&gt;
&lt;th&gt;Event Loops (Non-blocking I/O)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Programming Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sequential, imperative&lt;/td&gt;
&lt;td&gt;Callback-based, state machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory per connection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1KB heap (stack chunk)&lt;/td&gt;
&lt;td&gt;~Few bytes (state machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mount/unmount (1-5μs)&lt;/td&gt;
&lt;td&gt;State machine transitions (~100ns)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debuggability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stack traces work perfectly&lt;/td&gt;
&lt;td&gt;Callback hell, fragmented traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max connections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Millions (heap limited)&lt;/td&gt;
&lt;td&gt;Millions (memory limited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple, readable&lt;/td&gt;
&lt;td&gt;Complex, hard to follow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business logic, DB queries&lt;/td&gt;
&lt;td&gt;High-throughput proxies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;when-to-use-virtual-threads&#34;&gt;When to Use Virtual Threads&lt;/h3&gt;
&lt;p&gt;I use virtual threads when:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complex business logic&lt;/strong&gt;: Multiple database calls, service calls, branching logic. Sequential code wins. Debugging wins. Maintainability wins.&lt;/p&gt;
&lt;p&gt;Example: Processing a payment involves calling fraud detection, inventory check, payment gateway, sending email confirmation. Sequential code with virtual threads is 10x easier to write and debug than callback chains.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moderate connection counts&lt;/strong&gt;: 10K-100K concurrent connections. Virtual threads handle this easily. The memory overhead is acceptable. The mount/unmount cost is negligible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team velocity&lt;/strong&gt;: Most developers understand sequential code. Onboarding is faster. Code reviews are easier. Bugs are simpler to fix.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a basic HTTP server implementation using virtual threads:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.example&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.OutputStream&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.InetSocketAddress&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.charset.StandardCharsets&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.Executors&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;VirtualThreadsHttpServer&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; PORT = 8080;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        HttpServer server = HttpServer.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InetSocketAddress(PORT), 0);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Use virtual thread executor
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        server.&lt;span style=&#34;color:#bbb&#34;&gt;setExecutor&lt;/span&gt;(Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newVirtualThreadPerTaskExecutor&lt;/span&gt;());

        server.&lt;span style=&#34;color:#bbb&#34;&gt;createContext&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, exchange -&amp;gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate some work (database call, REST call, etc.)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This would block a platform thread, but virtual thread unmounts
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            simulateWork();

            String response = buildResponse();
            exchange.&lt;span style=&#34;color:#bbb&#34;&gt;getResponseHeaders&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;);
            exchange.&lt;span style=&#34;color:#bbb&#34;&gt;sendResponseHeaders&lt;/span&gt;(200, response.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;());

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (OutputStream os = exchange.&lt;span style=&#34;color:#bbb&#34;&gt;getResponseBody&lt;/span&gt;()) {
                os.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(response.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;(StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;));
            }
        });

        server.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Virtual Threads HTTP Server started on port &amp;#34;&lt;/span&gt; + PORT);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Available processors: &amp;#34;&lt;/span&gt; + Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Print stats every 10 seconds
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;startVirtualThread&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(10_000);
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Stats - Active threads: %d, Virtual threads: yes%n&amp;#34;&lt;/span&gt;,
                            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;activeCount&lt;/span&gt;());
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                }
            }
        });
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;simulateWork&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate blocking I/O (database query, REST call, etc.)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(10);  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 10ms simulated I/O
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;buildResponse&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;{\&amp;#34;message\&amp;#34;:\&amp;#34;Hello from Virtual Threads\&amp;#34;,\&amp;#34;thread\&amp;#34;:\&amp;#34;%s\&amp;#34;,\&amp;#34;timestamp\&amp;#34;:%d}&amp;#34;&lt;/span&gt;,
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(),
                System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;()
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Total blocking time: ~10ms per request. With platform threads, this ties up a thread for 10ms. With virtual threads, the carrier thread stays free. The virtual thread unmounts at each blocking call. Other virtual threads run.&lt;/p&gt;
&lt;h3 id=&#34;when-to-use-event-loops&#34;&gt;When to Use Event Loops&lt;/h3&gt;
&lt;p&gt;I use event loops when:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ultra-high connection counts&lt;/strong&gt;: 100K-1M+ connections. Memory matters. Every byte counts. Event loops use ~5KB per connection. Virtual threads use ~1KB+ heap plus JVM overhead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simple request/response patterns&lt;/strong&gt;: API gateways, load balancers, WebSocket servers, streaming proxies. The logic is simple: read request, forward it, write response. State machines work fine here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maximum memory efficiency&lt;/strong&gt;: You&amp;rsquo;re running on constrained hardware. You need to squeeze every ounce of performance. You can&amp;rsquo;t afford the mount/unmount overhead.&lt;/p&gt;
&lt;p&gt;Real example: I built an API gateway that routes requests to backend services. Peak load: 500K concurrent WebSocket connections. Each connection forwards messages bidirectionally. Minimal state. Event loops won.&lt;/p&gt;
&lt;p&gt;The entire gateway ran on 4 CPU cores, 2GB heap. Event loops handled all 500K connections. Virtual threads would&amp;rsquo;ve used ~500MB just for stacks. Plus mount/unmount overhead on every message.&lt;/p&gt;
&lt;h3 id=&#34;the-hybrid-approach&#34;&gt;The Hybrid Approach&lt;/h3&gt;
&lt;p&gt;Production system can use both at the same time. Netty uses event loops for network I/O, then dispatches business logic to thread pools (or virtual threads in newer versions).&lt;/p&gt;
&lt;p&gt;Pattern:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Event loop handles network I/O (Netty&amp;#39;s EventLoopGroup)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ServerBootstrap bootstrap = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ServerBootstrap();
bootstrap.&lt;span style=&#34;color:#bbb&#34;&gt;group&lt;/span&gt;(bossGroup, workerGroup)  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Event loops
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    .&lt;span style=&#34;color:#bbb&#34;&gt;channel&lt;/span&gt;(NioServerSocketChannel.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)
    .&lt;span style=&#34;color:#bbb&#34;&gt;childHandler&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ChannelInitializer&amp;lt;SocketChannel&amp;gt;() {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;initChannel&lt;/span&gt;(SocketChannel ch) {
            ch.&lt;span style=&#34;color:#bbb&#34;&gt;pipeline&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;addLast&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HttpServerCodec());
            ch.&lt;span style=&#34;color:#bbb&#34;&gt;pipeline&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;addLast&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HttpObjectAggregator(65536));
            ch.&lt;span style=&#34;color:#bbb&#34;&gt;pipeline&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;addLast&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SimpleChannelInboundHandler&amp;lt;FullHttpRequest&amp;gt;() {
                &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;channelRead0&lt;/span&gt;(ChannelHandlerContext ctx, FullHttpRequest req) {
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Dispatch business logic to virtual thread pool
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;startVirtualThread&lt;/span&gt;(() -&amp;gt; {
                        var response = handleBusinessLogic(req);
                        ctx.&lt;span style=&#34;color:#bbb&#34;&gt;writeAndFlush&lt;/span&gt;(response);
                    });
                }
            });
        }
    });
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Event loops handle I/O multiplexing. Virtual threads handle business logic. Best of both worlds.&lt;/p&gt;
&lt;h2 id=&#34;benchmarks-and-repo-putting-both-to-the-test&#34;&gt;Benchmarks and Repo: Putting Both to the Test&lt;/h2&gt;
&lt;p&gt;To validate the trade-offs with real numbers, I added a benchmark suite to a small project that runs both implementations side by side. The repo is &lt;strong&gt;virtual-thread-eventloop-test&lt;/strong&gt; and is set up so you can run the same tests and draw your own conclusions.&lt;/p&gt;
&lt;h3 id=&#34;repo-layout&#34;&gt;Repo Layout&lt;/h3&gt;
&lt;p&gt;Here is the project link &lt;a href=&#34;https://github.com/dhrubo55/virtual-thread-eventloop-test&#34;&gt;GITHUB&lt;/a&gt; .The project contains two HTTP servers and a 4-phase benchmark suite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;VirtualThreadsHttpServer&lt;/code&gt;&lt;/strong&gt; (port 8080)   Java 21 &lt;code&gt;HttpServer&lt;/code&gt; with &lt;code&gt;Executors.newVirtualThreadPerTaskExecutor()&lt;/code&gt;. Each request runs on a virtual thread and does ~10 ms simulated blocking work (e.g. DB/REST). Simple sequential handler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;EventLoopHttpServer&lt;/code&gt;&lt;/strong&gt; (port 8081)   Single-thread NIO server: one &lt;code&gt;Selector&lt;/code&gt;, non-blocking &lt;code&gt;ServerSocketChannel&lt;/code&gt;/&lt;code&gt;SocketChannel&lt;/code&gt;, and the same 10 ms work simulated inside the event loop (no virtual threads). Pure reactor style.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both servers expose the same JSON endpoint and the same simulated workload so the comparison is about concurrency model, not API shape. Build with Maven; the &lt;code&gt;pom.xml&lt;/code&gt; produces two runnable JARs: &lt;code&gt;virtual-thread-app&lt;/code&gt; and &lt;code&gt;event-loop-app&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;benchmark-suite-4-phases&#34;&gt;Benchmark Suite (4 Phases)&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;benchmarks&lt;/strong&gt; folder holds a hypothesis-driven suite that measures throughput, latency, and resource use:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 1: Baseline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed loads (e.g. 100, 1K, 10K connections), 10s–300s, multiple runs&lt;/td&gt;
&lt;td&gt;Establish normal throughput and latency patterns.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 2: Progressive stress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ramp connections from 100 → 50K (e.g. +1K every 30s)&lt;/td&gt;
&lt;td&gt;Find where each implementation degrades or fails.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 3: Spike&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline (1K conn) → spike (10K conn) → back to 1K, repeated cycles&lt;/td&gt;
&lt;td&gt;Observe recovery and stability.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase 4: Endurance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constant load (e.g. 5K connections) for several hours per server&lt;/td&gt;
&lt;td&gt;Check for memory growth and long-term stability.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Load is generated with &lt;strong&gt;Bombardier&lt;/strong&gt; (Go-based HTTP benchmark). The repo includes &lt;code&gt;bombardier.exe&lt;/code&gt; in the scripts for Windows, so you can run the suite natively. The suite can collect JFR, JMX (e.g. VisualVM), and system metrics; the &lt;strong&gt;analyze-and-report&lt;/strong&gt; script turns raw results into CSVs and a &lt;strong&gt;FINAL-REPORT.md&lt;/strong&gt; in &lt;code&gt;benchmark-results/.../analysis/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;results-from-a-sample-run&#34;&gt;Results From a Sample Run&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Test machine&lt;/strong&gt; (from the benchmark run’s &lt;code&gt;config.json&lt;/code&gt;): 16 CPU cores, &lt;strong&gt;31.82 GB&lt;/strong&gt; RAM, &lt;strong&gt;183 GB&lt;/strong&gt; free disk. Each server ran with &lt;strong&gt;4 GB&lt;/strong&gt; heap (-Xmx4096m). Bombardier used 14 worker threads. Windows host.&lt;/p&gt;
&lt;p&gt;From one full run (Phase 1–3; Phase 2 summary and report):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Peak throughput:&lt;/strong&gt; Event Loop ~&lt;strong&gt;4,627&lt;/strong&gt; req/s vs Virtual Threads ~&lt;strong&gt;3,926&lt;/strong&gt; req/s   event loop ahead under this workload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Breaking point (Phase 2):&lt;/strong&gt; Both hit limits around &lt;strong&gt;15,000&lt;/strong&gt; connections in that environment (stress ramp).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Winner in this setup:&lt;/strong&gt; Event Loop, for peak RPS, with both degrading at similar connection counts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So for this “many connections, small fixed delay per request” scenario, the single-thread event loop gave higher throughput, while virtual threads stayed in the same ballpark and remained predictable. Your mileage will depend on hardware, OS, and actual workload (e.g. real DB or HTTP calls).&lt;/p&gt;
&lt;h3 id=&#34;how-to-run-it-yourself&#34;&gt;How to Run It Yourself&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clone/build:&lt;/strong&gt; Open the &lt;strong&gt;virtual-thread-eventloop-test&lt;/strong&gt; repo, build with Maven (&lt;code&gt;mvn package&lt;/code&gt;). Use JDK 21+.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start both servers&lt;/strong&gt; with enough heap (e.g. &lt;code&gt;-Xmx4096m&lt;/code&gt;) and JMX if you want VisualVM. Virtual threads on 8080, event loop on 8081.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run the benchmark orchestrator&lt;/strong&gt; from the &lt;code&gt;benchmarks&lt;/code&gt; folder (see &lt;code&gt;README.md&lt;/code&gt; and &lt;code&gt;QUICK-REFERENCE.md&lt;/code&gt;). The suite uses Bombardier for load generation (e.g. &lt;code&gt;bombardier.exe&lt;/code&gt; on Windows); ensure both servers are reachable from the machine running the benchmark.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze:&lt;/strong&gt; Run the analysis script to generate &lt;code&gt;FINAL-REPORT.md&lt;/code&gt; and the CSV summaries under &lt;code&gt;benchmark-results/.../analysis/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The README in &lt;strong&gt;benchmarks&lt;/strong&gt; explains the hypothesis template (predict VT vs EL before running), what to monitor in VisualVM, and how to interpret throughput, latency percentiles, and breaking points. Repeating the suite on your own machine is a good way to see how the two models behave under your constraints.&lt;/p&gt;
&lt;h2 id=&#34;the-production-decision&#34;&gt;The Production Decision&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s my mental model :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start with virtual threads&lt;/strong&gt;: For 95% of applications, virtual threads are the right default. Simpler code. Easier debugging. Good enough performance. Your business logic probably involves databases, REST calls, file I/O. Sequential code wins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Switch to event loops when&lt;/strong&gt;: You&amp;rsquo;re building infrastructure. API gateways. Load balancers. Proxies. WebSocket servers. High connection counts with simple logic. Memory is constrained. You need maximum throughput.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use both when&lt;/strong&gt;: You&amp;rsquo;re building a platform. Use event loops for network layer (Netty, Vert.x). Use virtual threads for business logic. This is what modern frameworks do.&lt;/p&gt;
&lt;p&gt;I made the mistake of using event loops for business logic in 2015. Callback hell. Debugging nightmares. Three-hour sessions tracing through fragmented stack traces. Never again. Virtual threads solved that problem.&lt;/p&gt;
&lt;p&gt;The right tool depends on your constraints. Virtual threads didn&amp;rsquo;t replace event loops. They made blocking I/O a viable alternative for most use cases. But if you&amp;rsquo;re pushing extreme scale on minimal hardware, event loops still win.&lt;/p&gt;
&lt;h2 id=&#34;what-i-learned&#34;&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;Virtual threads and event loops solve different problems:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Virtual threads&lt;/strong&gt;: Make blocking I/O scalable. Keep sequential code readable. Remove the need for thread pool tuning. Perfect for business logic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Event loops&lt;/strong&gt;: Maximize connection density. Minimize memory overhead. Handle simple I/O patterns efficiently. Perfect for infrastructure.&lt;/p&gt;
&lt;p&gt;Understanding both models gives you the full picture of Java&amp;rsquo;s I/O concurrency landscape. You can make informed decisions based on your actual constraints, not hype or cargo-culting.&lt;/p&gt;
&lt;p&gt;Next time you&amp;rsquo;re designing a system, ask: What&amp;rsquo;s the connection pattern? What&amp;rsquo;s the business logic complexity? What are the memory constraints? Then choose the right model.&lt;/p&gt;
&lt;p&gt;Both are tools. Use the right one for the job.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Why Your Parallel Streams were Leaving CPU Cores Idle (And How to Fix It)</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day100-spliterator/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day100-spliterator/</id>
    <published>2025-12-24T00:00:00Z</published>
    <updated>2026-04-07T10:47:19&#43;06:00</updated>
    <summary type="html">Parallel streams gave me 60% CPU utilization on 8 cores. I thought that was good. Then I discovered why the default spliterator creates massive load imbalance, and how a 50-line custom implementation cut processing time by 40%.</summary>
    <content type="html">&lt;p&gt;I added &lt;code&gt;.parallel()&lt;/code&gt; to my stream. Eight cores. Should be 8x faster, right?&lt;/p&gt;
&lt;p&gt;Nope. 60% CPU utilization. Cores sitting idle. Processing 100 million rows took 5.2 seconds when it should&amp;rsquo;ve taken under 2.&lt;/p&gt;
&lt;p&gt;What I didn&amp;rsquo;t get at first: the default Java Stream API has a load balancing problem. When you call &lt;code&gt;.parallel()&lt;/code&gt; on an I/O-based source like &lt;code&gt;Files.lines()&lt;/code&gt;, the spliterator that divides work among threads uses a growing batch size strategy: 1, 2, 4, 8, 16&amp;hellip; up to 16,384 elements per batch.&lt;/p&gt;
&lt;p&gt;This creates massive imbalance. One thread gets a 16K batch and grinds away for 200ms. The other seven threads finish their tiny batches in 10ms and sit idle, waiting.&lt;/p&gt;
&lt;p&gt;I found this out the hard way on the One Billion Row Challenge, which is exactly what it sounds like: process 1 billion rows of weather data as fast as possible. The task is simple: read a text file where each line is &lt;code&gt;station_name;temperature&lt;/code&gt;, compute min/mean/max per station, output sorted results.&lt;/p&gt;
&lt;p&gt;Top solutions finish in under 2 seconds using &lt;code&gt;Unsafe&lt;/code&gt;, memory-mapped I/O, and custom parsers. I wanted to understand the fundamentals first: why does the Stream API struggle with this workload, and can we fix it without ditching the abstraction?&lt;/p&gt;
&lt;p&gt;You can. A 50-line custom spliterator cut my processing time by 40% and pushed CPU utilization from 60% to 95%. No &lt;code&gt;Unsafe&lt;/code&gt;. No native code. Just fixing the load balancing problem the JDK gets wrong.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-load-balancing-problem-what-actually-happens&#34;&gt;The load balancing problem: what actually happens&lt;/h2&gt;
&lt;p&gt;First version looked like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;String&amp;gt; lines = Files.&lt;span style=&#34;color:#bbb&#34;&gt;lines&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;measurements.txt&amp;#34;&lt;/span&gt;))) {
    Map&amp;lt;String, DoubleSummaryStatistics&amp;gt; result = lines
        .&lt;span style=&#34;color:#bbb&#34;&gt;parallel&lt;/span&gt;()
        .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(line -&amp;gt; line.&lt;span style=&#34;color:#bbb&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;;&amp;#34;&lt;/span&gt;))
        .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingBy&lt;/span&gt;(
            parts -&amp;gt; parts[0],
            Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;summarizingDouble&lt;/span&gt;(parts -&amp;gt; Double.&lt;span style=&#34;color:#bbb&#34;&gt;parseDouble&lt;/span&gt;(parts[1]))
        ));
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Eight cores. Should be fast. Wasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I opened &lt;code&gt;jconsole&lt;/code&gt; to watch CPU. This is what I saw:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Core 0: 95%  ████████████████████
Core 1: 95%  ████████████████████
Core 2: 95%  ████████████████████
Core 3: 15%  ███░░░░░░░░░░░░░░░░░
Core 4: 15%  ███░░░░░░░░░░░░░░░░░
Core 5: 15%  ███░░░░░░░░░░░░░░░░░
Core 6: 15%  ███░░░░░░░░░░░░░░░░░
Core 7: 15%  ███░░░░░░░░░░░░░░░░░
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Three cores maxed out. Five cores mostly idle. Average: ~60%.&lt;/p&gt;
&lt;p&gt;The problem is the &lt;code&gt;Spliterator&lt;/code&gt;, the thing that divides work among threads. When you call &lt;code&gt;Files.lines().parallel()&lt;/code&gt;, you get a spliterator that doesn&amp;rsquo;t know the file size upfront. It can&amp;rsquo;t split the file into eight equal chunks because it&amp;rsquo;s reading sequentially.&lt;/p&gt;
&lt;p&gt;So it uses a different strategy: growing batches. First split creates a batch of 1 element. Next split: 2 elements. Then 4, 8, 16, 32, 64&amp;hellip; up to 16,384.&lt;/p&gt;
&lt;p&gt;This is arithmetic progression with a cap. The JDK hardcodes these numbers in &lt;code&gt;AbstractSpliterator&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Why? To minimize split overhead. Creating a new batch has cost: allocating arrays, coordinating threads, managing the work queue. If batches are too small, you spend more time splitting than processing.&lt;/p&gt;
&lt;p&gt;But this optimization backfires for &lt;code&gt;I/O workloads&lt;/code&gt;. Here&amp;rsquo;s what happens:&lt;/p&gt;
&lt;p&gt;Timeline of a parallel stream with growing batches:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Time 0ms:   Thread 1 gets batch of 1 element    (processes in 0.05ms)
Time 1ms:   Thread 2 gets batch of 2 elements   (processes in 0.1ms)
Time 2ms:   Thread 3 gets batch of 4 elements   (processes in 0.2ms)
Time 3ms:   Thread 4 gets batch of 8 elements   (processes in 0.4ms)
...
Time 50ms:  Thread 1 gets batch of 16,384 elements (processes in 820ms)
Time 51ms:  Thread 2 gets batch of 16,384 elements (processes in 820ms)
Time 52ms:  Thread 3 gets batch of 16,384 elements (processes in 820ms)
Time 870ms: Threads 4-8 are idle, waiting for threads 1-3 to finish
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The last few threads to grab work get massive batches. Everyone else finishes early and waits.&lt;/p&gt;
&lt;p&gt;This is the load balancing problem. The spliterator optimizes for split overhead, not work distribution.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-fix-stop-growing-batches&#34;&gt;The fix: stop growing batches&lt;/h2&gt;
&lt;p&gt;Marko Topolnik figured this out in 2014. Don&amp;rsquo;t let batch size grow. Pick a size and stick with it.&lt;/p&gt;
&lt;p&gt;Instead of 1, 2, 4, 8, 16&amp;hellip; just do 10,000, 10,000, 10,000, 10,000.&lt;/p&gt;
&lt;p&gt;Every thread gets the same amount of work. No imbalance. No idle cores.&lt;/p&gt;
&lt;p&gt;The implementation is 50 lines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FixedBatchSpliteratorBase&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Spliterator&amp;lt;T&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; characteristics;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; estimatedSize;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;FixedBatchSpliteratorBase&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; characteristics, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; estimatedSize) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;characteristics&lt;/span&gt; = characteristics | SUBSIZED;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;batchSize&lt;/span&gt; = batchSize;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;estimatedSize&lt;/span&gt; = estimatedSize;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Spliterator&amp;lt;T&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;trySplit&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; HoldingConsumer&amp;lt;T&amp;gt; holder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HoldingConsumer&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!tryAdvance(holder)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Object[] batch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Object[batchSize];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; j = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;do&lt;/span&gt; {
            batch[j] = holder.&lt;span style=&#34;color:#bbb&#34;&gt;value&lt;/span&gt;;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (++j &amp;lt; batchSize &amp;amp;&amp;amp; tryAdvance(holder));

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (estimatedSize != Long.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;) {
            estimatedSize -= j;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;(batch, 0, j, characteristics());
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;estimateSize&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; estimatedSize;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;characteristics&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; characteristics;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;HoldingConsumer&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Consumer&amp;lt;T&amp;gt; {
        T value;
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;accept&lt;/span&gt;(T value) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;value&lt;/span&gt; = value;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The base class handles batching. You implement &lt;code&gt;tryAdvance()&lt;/code&gt; to read one element:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FileLineSpliterator&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; FixedBatchSpliteratorBase&amp;lt;String&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BufferedReader reader;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;FileLineSpliterator&lt;/span&gt;(BufferedReader reader, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; estimatedSize) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;(ORDERED | NONNULL | IMMUTABLE, batchSize, estimatedSize);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;reader&lt;/span&gt; = reader;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; String&amp;gt; action) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            String line = reader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (line == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
            action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(line);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; UncheckedIOException(e);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Stream&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;stream&lt;/span&gt;(Path path, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        BufferedReader reader = Files.&lt;span style=&#34;color:#bbb&#34;&gt;newBufferedReader&lt;/span&gt;(path);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; estimatedSize = Files.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;(path) / 50;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileLineSpliterator(reader, batchSize, estimatedSize),
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;
        ).&lt;span style=&#34;color:#bbb&#34;&gt;onClose&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                reader.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; UncheckedIOException(e);
            }
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. &lt;code&gt;tryAdvance()&lt;/code&gt; reads one line. The base class calls it &lt;code&gt;batchSize&lt;/code&gt; times, fills an array, hands that array to a thread. Repeat until the file ends. The &lt;code&gt;estimatedSize&lt;/code&gt; is a rough guess (file size divided by 50, assuming ~50 bytes per line on average) that the ForkJoinPool uses to decide how aggressively to split work.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-this-actually-does&#34;&gt;What this actually does&lt;/h2&gt;
&lt;p&gt;When you call &lt;code&gt;.parallel()&lt;/code&gt; on this stream, the ForkJoinPool calls &lt;code&gt;trySplit()&lt;/code&gt; repeatedly to create work for threads.&lt;/p&gt;
&lt;p&gt;With the default spliterator, thread 1 gets 1 element, thread 2 gets 2, thread 3 gets 4, and so on. Thread 8 ends up with 16,384 elements and processes for 820ms while the others sit there.&lt;/p&gt;
&lt;p&gt;With the fixed-batch spliterator:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread 1: 10,000 elements (~500ms)&lt;/li&gt;
&lt;li&gt;Thread 2: 10,000 elements (~500ms)&lt;/li&gt;
&lt;li&gt;Thread 3: 10,000 elements (~500ms)&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;li&gt;Thread 8: 10,000 elements (~500ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They all finish at roughly the same time.&lt;/p&gt;
&lt;p&gt;No idle cores. No wasted CPU.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;using-it-for-the-one-billion-row-challenge&#34;&gt;Using it for the One Billion Row Challenge&lt;/h2&gt;
&lt;p&gt;The challenge: read &lt;a href=&#34;/posts/posts/java/100daysofjava/day91/#1-memory-mapped-files-the-magicians-trick&#34;&gt;1 billion rows&lt;/a&gt; of &lt;code&gt;station;temperature&lt;/code&gt;, compute min/mean/max per station, output sorted.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;OneBillionRowChallenge&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        Path inputFile = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;measurements.txt&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; start = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        
        Map&amp;lt;String, StationStats&amp;gt; results;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;String&amp;gt; lines = FileLineSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(inputFile, 10_000)) {
            results = lines
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(OneBillionRowChallenge::parseLine)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingByConcurrent&lt;/span&gt;(
                    Measurement::station,
                    Collector.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
                        StationStats::&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt;,
                        StationStats::accept,
                        StationStats::combine
                    )
                ));
        }
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Sort and print
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        results.&lt;span style=&#34;color:#bbb&#34;&gt;entrySet&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;sorted&lt;/span&gt;(Map.&lt;span style=&#34;color:#bbb&#34;&gt;Entry&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;comparingByKey&lt;/span&gt;())
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(entry -&amp;gt; {
                StationStats stats = entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;();
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%s=%.1f/%.1f/%.1f%n&amp;#34;&lt;/span&gt;,
                    entry.&lt;span style=&#34;color:#bbb&#34;&gt;getKey&lt;/span&gt;(),
                    stats.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;,
                    stats.&lt;span style=&#34;color:#bbb&#34;&gt;sum&lt;/span&gt; / stats.&lt;span style=&#34;color:#bbb&#34;&gt;count&lt;/span&gt;,
                    stats.&lt;span style=&#34;color:#bbb&#34;&gt;max&lt;/span&gt;
                );
            });
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; end = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%.2f seconds%n&amp;#34;&lt;/span&gt;, (end - start) / 1_000_000_000.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Measurement &lt;span style=&#34;color:#447fcf&#34;&gt;parseLine&lt;/span&gt;(String line) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; idx = line.&lt;span style=&#34;color:#bbb&#34;&gt;indexOf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);
        String station = line.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(0, idx);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; temp = Double.&lt;span style=&#34;color:#bbb&#34;&gt;parseDouble&lt;/span&gt;(line.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(idx + 1));
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Measurement(station, temp);
    }
    
    record &lt;span style=&#34;color:#447fcf&#34;&gt;Measurement&lt;/span&gt;(String station, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; temp) {}
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;StationStats&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; min = Double.&lt;span style=&#34;color:#bbb&#34;&gt;POSITIVE_INFINITY&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; max = Double.&lt;span style=&#34;color:#bbb&#34;&gt;NEGATIVE_INFINITY&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; sum = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; count = 0;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;accept&lt;/span&gt;(Measurement m) {
            min = Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(min, m.&lt;span style=&#34;color:#bbb&#34;&gt;temp&lt;/span&gt;);
            max = Math.&lt;span style=&#34;color:#bbb&#34;&gt;max&lt;/span&gt;(max, m.&lt;span style=&#34;color:#bbb&#34;&gt;temp&lt;/span&gt;);
            sum += m.&lt;span style=&#34;color:#bbb&#34;&gt;temp&lt;/span&gt;;
            count++;
        }
        
        StationStats &lt;span style=&#34;color:#447fcf&#34;&gt;combine&lt;/span&gt;(StationStats other) {
            min = Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(min, other.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;);
            max = Math.&lt;span style=&#34;color:#bbb&#34;&gt;max&lt;/span&gt;(max, other.&lt;span style=&#34;color:#bbb&#34;&gt;max&lt;/span&gt;);
            sum += other.&lt;span style=&#34;color:#bbb&#34;&gt;sum&lt;/span&gt;;
            count += other.&lt;span style=&#34;color:#bbb&#34;&gt;count&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Changed one line: &lt;code&gt;Files.lines(path).parallel()&lt;/code&gt; became &lt;code&gt;FileLineSpliterator.stream(path, 10_000)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Result: 40% faster.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;picking-the-right-batch-size&#34;&gt;Picking the right batch size&lt;/h2&gt;
&lt;p&gt;I tried different batch sizes on 100 million rows:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Batch Size&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;CPU Util&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default JDK&lt;/td&gt;
&lt;td&gt;5.2s&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;1.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.1s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.8 GB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;3.4s&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;2.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;4.0s&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;2.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;10,000 was the sweet spot. 40% faster than default. CPU utilization jumped from 60% to 95%.&lt;/p&gt;
&lt;p&gt;Why not 1,000? Too much overhead. Each batch requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allocating an &lt;code&gt;Object[]&lt;/code&gt; array&lt;/li&gt;
&lt;li&gt;Filling it with elements&lt;/li&gt;
&lt;li&gt;Creating a new &lt;code&gt;Spliterator&lt;/code&gt; wrapper&lt;/li&gt;
&lt;li&gt;Submitting it to the ForkJoinPool&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At 1,000 elements per batch, you&amp;rsquo;re creating 100,000 batches for 100M rows. That&amp;rsquo;s 100,000 array allocations, 100,000 spliterator objects, 100,000 pool submissions. The GC can&amp;rsquo;t keep up. You spend more time managing batches than processing data.&lt;/p&gt;
&lt;p&gt;Why not 100,000? Back to the load imbalance problem. If each batch takes 5 seconds to process and you have 8 threads, the last thread to get work might process for 5 seconds while others sit idle.&lt;/p&gt;
&lt;p&gt;Topolnik&amp;rsquo;s rule: each batch should take 1–10 ms to process. That balances batch overhead (allocation, coordination, GC) against load imbalance (idle threads waiting).&lt;/p&gt;
&lt;p&gt;For this workload on my machine, 10,000 rows takes about 5ms to process. Perfect.&lt;/p&gt;
&lt;p&gt;Your optimal size depends on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How expensive each row is to process&lt;/li&gt;
&lt;li&gt;Your core count (more cores = need more batches)&lt;/li&gt;
&lt;li&gt;Your I/O speed (faster I/O = can handle smaller batches)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Measure. Don&amp;rsquo;t guess.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;where-the-time-goes&#34;&gt;Where the time goes&lt;/h2&gt;
&lt;p&gt;I ran this through JFR (Java Flight Recorder) to see the breakdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Total: 3.1 seconds for 100M rows

I/O (BufferedReader.readLine):        0.8s  (26%)
Parsing (indexOf + substring + parse): 1.4s  (45%)
Aggregation (ConcurrentHashMap):       0.6s  (19%)
Thread coordination:                   0.2s  (6%)
GC:                                    0.1s  (3%)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Parsing is the bottleneck. 45% of time goes to &lt;code&gt;indexOf()&lt;/code&gt;, &lt;code&gt;substring()&lt;/code&gt;, and &lt;code&gt;Double.parseDouble()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This surprised me. I thought I/O would dominate. Nope. Modern SSDs are fast; sequential reads hit 3–5 GB/s. Reading 5 GB of text takes under 2 seconds.&lt;/p&gt;
&lt;p&gt;But parsing? Every row requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;indexOf(&#39;;&#39;)&lt;/code&gt; - scan bytes looking for semicolon&lt;/li&gt;
&lt;li&gt;&lt;code&gt;substring(0, idx)&lt;/code&gt; - allocate new String for station name&lt;/li&gt;
&lt;li&gt;&lt;code&gt;substring(idx + 1)&lt;/code&gt; - allocate new String for temperature&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Double.parseDouble()&lt;/code&gt; - parse string to double&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s three string allocations per row. 100 million rows = 300 million strings. Each string is 16 bytes of object header + char array + length. That&amp;rsquo;s ~5 GB of allocations just for parsing.&lt;/p&gt;
&lt;p&gt;The GC handles it (only 3% overhead) because these strings are short-lived. But the allocation and copying still burns CPU.&lt;/p&gt;
&lt;p&gt;Top 1BRC solutions don&amp;rsquo;t use &lt;code&gt;String.split()&lt;/code&gt; or &lt;code&gt;substring()&lt;/code&gt;. They parse directly from byte arrays. No allocations. Just pointer arithmetic and manual digit parsing.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the next optimization. But it requires abandoning the Stream API and working with raw byte buffers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-top-solutions-get-under-2-seconds&#34;&gt;How top solutions get under 2 seconds&lt;/h2&gt;
&lt;p&gt;My fixed-batch implementation: 3.1 seconds for 100M rows. Extrapolate to 1B rows: ~31 seconds.&lt;/p&gt;
&lt;p&gt;Top 1BRC solutions: under 2 seconds for 1B rows.&lt;/p&gt;
&lt;p&gt;What are they doing?&lt;/p&gt;
&lt;h3 id=&#34;1-custom-parsing&#34;&gt;1. Custom Parsing&lt;/h3&gt;
&lt;p&gt;They don&amp;rsquo;t use &lt;code&gt;String.split()&lt;/code&gt; or &lt;code&gt;Double.parseDouble()&lt;/code&gt;. They parse bytes directly. Here&amp;rsquo;s what I do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; idx = line.&lt;span style=&#34;color:#bbb&#34;&gt;indexOf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;);
String station = line.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(0, idx);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; temp = Double.&lt;span style=&#34;color:#bbb&#34;&gt;parseDouble&lt;/span&gt;(line.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(idx + 1));
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s what top solutions do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; idx = findSemicolon(bytes, offset);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; stationHash = hashBytes(bytes, offset, idx);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; temp = parseDouble(bytes, idx + 1);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No string allocations. No substring copies. Just pointer arithmetic and manual digit parsing.&lt;/p&gt;
&lt;p&gt;They also use hash codes instead of strings for station names. Store the hash in a primitive long array. Only materialize the actual string at the end for output.&lt;/p&gt;
&lt;p&gt;Roughly 30–40% of parsing time saved.&lt;/p&gt;
&lt;h3 id=&#34;2-memory-mapped-io&#34;&gt;2. Memory-Mapped I/O&lt;/h3&gt;
&lt;p&gt;Instead of &lt;code&gt;BufferedReader&lt;/code&gt;, they use &lt;code&gt;FileChannel.map()&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;FileChannel channel = FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;open&lt;/span&gt;(path, StandardOpenOption.&lt;span style=&#34;color:#bbb&#34;&gt;READ&lt;/span&gt;);
MappedByteBuffer buffer = channel.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;MapMode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;READ_ONLY&lt;/span&gt;, 0, channel.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The OS maps the file directly into process memory. No read() syscalls. No copying from kernel space to user space. Just pointer dereferences.&lt;/p&gt;
&lt;p&gt;About 10–15% of I/O time saved.&lt;/p&gt;
&lt;h3 id=&#34;3-thread-local-aggregation&#34;&gt;3. Thread-Local Aggregation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConcurrentHashMap&lt;/code&gt; has overhead. Every &lt;code&gt;put()&lt;/code&gt; or &lt;code&gt;compute()&lt;/code&gt; requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hash calculation&lt;/li&gt;
&lt;li&gt;CAS operation to check for contention&lt;/li&gt;
&lt;li&gt;Potential lock acquisition if bucket is contested&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead, each thread maintains its own &lt;code&gt;HashMap&lt;/code&gt;. No contention. No CAS. No locks. At the end, merge all maps single-threaded.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Map&amp;lt;String, StationStats&amp;gt;[] localMaps = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Map[numThreads];

Map&amp;lt;String, StationStats&amp;gt; result = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Map&amp;lt;String, StationStats&amp;gt; local : localMaps) {
    local.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;((station, stats) -&amp;gt; 
        result.&lt;span style=&#34;color:#bbb&#34;&gt;merge&lt;/span&gt;(station, stats, StationStats::combine)
    );
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;About half of aggregation time saved.&lt;/p&gt;
&lt;h3 id=&#34;4-unsafe&#34;&gt;4. Unsafe&lt;/h3&gt;
&lt;p&gt;Top solutions use &lt;code&gt;sun.misc.Unsafe&lt;/code&gt; to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read memory without bounds checks&lt;/li&gt;
&lt;li&gt;Parse numbers with manual bit manipulation&lt;/li&gt;
&lt;li&gt;Use SIMD instructions for scanning bytes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not portable. Not safe. But fast.&lt;/p&gt;
&lt;p&gt;Another 20–30% on top of that.&lt;/p&gt;
&lt;h3 id=&#34;5-graalvm-native-image&#34;&gt;5. GraalVM Native Image&lt;/h3&gt;
&lt;p&gt;Compile to native binary. No JVM startup. No JIT warmup. No interpreter.&lt;/p&gt;
&lt;p&gt;1–2 seconds of fixed overhead gone.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-performance-ladder&#34;&gt;The performance ladder&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the full spectrum for 1 billion rows:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Portable?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sequential&lt;/td&gt;
&lt;td&gt;180s&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default &lt;code&gt;.parallel()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;52s&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixed-batch spliterator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Custom parsing&lt;/td&gt;
&lt;td&gt;22s&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Memory-mapped I/O&lt;/td&gt;
&lt;td&gt;19s&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Thread-local aggregation&lt;/td&gt;
&lt;td&gt;13s&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Unsafe&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ GraalVM native&lt;/td&gt;
&lt;td&gt;2s&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fixed-batch is the sweet spot. 3.5x faster than default. Still maintainable. Still portable.&lt;/p&gt;
&lt;p&gt;Everything after that trades maintainability for speed. Custom parsing means you&amp;rsquo;re writing your own &lt;code&gt;indexOf()&lt;/code&gt; and &lt;code&gt;parseDouble()&lt;/code&gt;. Memory-mapped I/O means you&amp;rsquo;re managing byte buffers and offsets. Thread-local aggregation means you&amp;rsquo;re manually partitioning work.&lt;/p&gt;
&lt;p&gt;And &lt;code&gt;Unsafe&lt;/code&gt;? You&amp;rsquo;re reading raw memory addresses. One off-by-one error and you segfault the JVM.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m comfortable stopping at fixed-batch for production code. The rest is for competitions and benchmarks.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;when-this-actually-helps&#34;&gt;When this actually helps&lt;/h2&gt;
&lt;p&gt;Fixed-batch spliterators make sense when you&amp;rsquo;re reading from I/O (files, network streams, database cursors) and can&amp;rsquo;t split the source upfront. They also help when per-element work is non-trivial (parsing, validation, transformation). If one element takes under a microsecond, batch overhead dominates. You need real parallelism: multiple cores and a workload that&amp;rsquo;s CPU-bound after I/O. And you want something maintainable: standard Java, no &lt;code&gt;Unsafe&lt;/code&gt;, nothing that makes code review painful.&lt;/p&gt;
&lt;p&gt;Skip it when your data is already in memory (arrays, lists, collections split fine on their own). Skip it when processing is trivial (simple filters or no-op maps); batch overhead costs more than you gain. If you&amp;rsquo;re I/O bound, parallelism won&amp;rsquo;t help; profile first. And if you need predictable latency, batching adds variance: some requests hit batch boundaries, others don&amp;rsquo;t.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-memory-cost&#34;&gt;The memory cost&lt;/h2&gt;
&lt;p&gt;Fixed-batch uses more memory than default streams.&lt;/p&gt;
&lt;p&gt;Why? Each batch materializes into an &lt;code&gt;Object[]&lt;/code&gt; array. With 8 threads and 10K batch size, you have 8 × 10K = 80K elements in memory.&lt;/p&gt;
&lt;p&gt;Measured on the 1BRC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Default stream: 1.2 GB peak&lt;/li&gt;
&lt;li&gt;Fixed-batch (10K): 1.8 GB peak&lt;/li&gt;
&lt;li&gt;Fixed-batch (50K): 2.5 GB peak&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re trading memory for CPU utilization. Usually worth it—memory is cheap, CPU is expensive.&lt;/p&gt;
&lt;p&gt;But if you&amp;rsquo;re memory-constrained (containers with tight limits, embedded systems), this matters. You might need smaller batches or a different approach.&lt;/p&gt;
&lt;p&gt;Also: larger batches mean larger arrays. Large arrays can cause GC issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Young gen collections happen more often&lt;/li&gt;
&lt;li&gt;Arrays might get promoted to old gen&lt;/li&gt;
&lt;li&gt;Fragmentation increases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I saw GC overhead jump from 3% to 8% when I went from 10K to 100K batch size. The arrays were large enough to survive young gen collections and get promoted. Then old gen filled up and triggered full GCs.&lt;/p&gt;
&lt;p&gt;Keep batches small enough to stay in young gen. For most workloads, that&amp;rsquo;s under 100K elements.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-surprised-me&#34;&gt;What surprised me&lt;/h2&gt;
&lt;p&gt;The default Stream API optimizes for the wrong thing. Growing batches minimize split overhead. For I/O workloads though, split overhead is tiny next to load imbalance. The JDK picked the wrong trade-off. I get why—they can&amp;rsquo;t know your workload. But it means &lt;code&gt;.parallel()&lt;/code&gt; often makes things slower. People try it, see worse numbers, and decide &amp;ldquo;parallel streams don&amp;rsquo;t work.&amp;rdquo; They do. The default spliterator doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I expected to spend most of my time waiting on disk. Nope. Parsing is the bottleneck. Modern SSDs do 3–5 GB/s sequential. Reading the file is a couple of seconds. Parsing is 14 seconds. String allocation, substring copies, &lt;code&gt;parseDouble()&lt;/code&gt;. That&amp;rsquo;s where the time goes. Top solutions avoid strings and parse bytes directly. No allocations, just arithmetic.&lt;/p&gt;
&lt;p&gt;Parallelism has steep diminishing returns. 1 thread to 8 threads: 8x (linear). Default parallel to fixed-batch: 1.7x. Fixed-batch to custom parsing: 1.4x. Custom parsing to Unsafe: 2.6x, but 10x the complexity. Each step is harder and gives less. Fixed-batch is the last easy win.&lt;/p&gt;
&lt;p&gt;The 1BRC isn&amp;rsquo;t about algorithms. It&amp;rsquo;s about constants. The gap between 30 seconds and 2 seconds is 3 string allocations per row vs zero, ConcurrentHashMap CAS vs thread-local HashMap, bounds-checked access vs Unsafe, JIT vs GraalVM native. Every microsecond counts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-id-do-differently-in-production&#34;&gt;What I&amp;rsquo;d do differently in production&lt;/h2&gt;
&lt;p&gt;For a system that processes large files (logs, CSV exports, data dumps), I&amp;rsquo;d start with the fixed-batch spliterator. Fifty lines, 40% speedup, still maintainable, runs on any JVM. If that&amp;rsquo;s not enough, custom parsing—bytes directly, no string allocations—but it&amp;rsquo;s easy to get wrong, so test carefully. If it&amp;rsquo;s still not enough, step back: do you really need to process 1B rows in one shot? Can you stream, preprocess, or partition across machines?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Unsafe&lt;/code&gt; and memory-mapped I/O are last resorts. The complexity and maintenance cost are real. I&amp;rsquo;ve seen teams spend weeks tuning hot paths with &lt;code&gt;Unsafe&lt;/code&gt; only to find the real bottleneck somewhere else. Profile first. Fix the algorithm and data structures. Then micro-optimize.&lt;/p&gt;
&lt;p&gt;The 1BRC rewards extreme optimization. Production rewards maintainability and correctness. Fixed-batch sits in the middle.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-complete-implementation&#34;&gt;The complete implementation&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s everything you need to benchmark this yourself. The &lt;code&gt;benchmark&lt;/code&gt; helper runs 3 warmup iterations to let the JIT compile the hot path, then 5 timed runs and reports the median:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;109
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;110
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;111
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;112
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;113
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;114
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;115
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;116
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;117
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;118
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;119
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;120
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;121
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;122
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BenchmarkFixedBatch&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; numRows = args.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 0 ? Integer.&lt;span style=&#34;color:#bbb&#34;&gt;parseInt&lt;/span&gt;(args[0]) : 1_000_000_000;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] batchSizes = args.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 1
                ? parseBatchSizes(args[1])
                : &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[]{1_000, 10_000, 50_000, 100_000};

        Path testFile = generateTestFile(numRows);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Benchmarking &amp;#34;&lt;/span&gt; + String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%,d&amp;#34;&lt;/span&gt;, numRows) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; rows...\n&amp;#34;&lt;/span&gt;);

        benchmark(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Sequential&amp;#34;&lt;/span&gt;, () -&amp;gt; processSequential(testFile));
        benchmark(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Default Parallel&amp;#34;&lt;/span&gt;, () -&amp;gt; processDefaultParallel(testFile));

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize : batchSizes) {
            benchmark(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Fixed-Batch &amp;#34;&lt;/span&gt; + batchSize,
                    () -&amp;gt; processFixedBatch(testFile, batchSize));
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;parseBatchSizes&lt;/span&gt;(String arg) {
        String[] parts = arg.&lt;span style=&#34;color:#bbb&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] sizes = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[parts.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; parts.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
            sizes[i] = Integer.&lt;span style=&#34;color:#bbb&#34;&gt;parseInt&lt;/span&gt;(parts[i].&lt;span style=&#34;color:#bbb&#34;&gt;trim&lt;/span&gt;());
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; sizes;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;benchmark&lt;/span&gt;(String name, ThrowingRunnable task) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { task.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;(); } 
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) { &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e); }
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;[] times = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;[5];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 5; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; start = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { task.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;(); } 
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) { &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e); }
            times[i] = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;() - start;
        }
        
        Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;sort&lt;/span&gt;(times);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; median = times[2] / 1_000_000_000.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;;
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%-20s: %.2f seconds%n&amp;#34;&lt;/span&gt;, name, median);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, StationStats&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processSequential&lt;/span&gt;(Path path) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;String&amp;gt; lines = Files.&lt;span style=&#34;color:#bbb&#34;&gt;lines&lt;/span&gt;(path)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; lines
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(OneBillionRowChallenge::parseLine)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingBy&lt;/span&gt;(
                    Measurement::station,
                    Collector.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
                        StationStats::&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt;,
                        StationStats::accept,
                        StationStats::combine
                    )
                ));
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, StationStats&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processDefaultParallel&lt;/span&gt;(Path path) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;String&amp;gt; lines = Files.&lt;span style=&#34;color:#bbb&#34;&gt;lines&lt;/span&gt;(path)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; lines
                .&lt;span style=&#34;color:#bbb&#34;&gt;parallel&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(OneBillionRowChallenge::parseLine)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingByConcurrent&lt;/span&gt;(
                    Measurement::station,
                    Collector.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
                        StationStats::&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt;,
                        StationStats::accept,
                        StationStats::combine
                    )
                ));
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, StationStats&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processFixedBatch&lt;/span&gt;(Path path, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize) 
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;String&amp;gt; lines = FileLineSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(path, batchSize)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; lines
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(OneBillionRowChallenge::parseLine)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingByConcurrent&lt;/span&gt;(
                    Measurement::station,
                    Collector.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
                        StationStats::&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt;,
                        StationStats::accept,
                        StationStats::combine
                    )
                ));
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Path &lt;span style=&#34;color:#447fcf&#34;&gt;generateTestFile&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; numRows) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        Path path = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;test_measurements_&amp;#34;&lt;/span&gt; + numRows + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.txt&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(path)) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; path;
        
        String[] stations = {
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hamburg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Bulawayo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Palembang&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;St. John&amp;#39;s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Cracow&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Bridgetown&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Istanbul&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Roseau&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Conakry&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Ankara&amp;#34;&lt;/span&gt;
        };
        
        Random random = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random(42);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (BufferedWriter writer = Files.&lt;span style=&#34;color:#bbb&#34;&gt;newBufferedWriter&lt;/span&gt;(path)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; numRows; i++) {
                String station = stations[random.&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(stations.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;)];
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; temp = -10 + random.&lt;span style=&#34;color:#bbb&#34;&gt;nextDouble&lt;/span&gt;() * 50;
                writer.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%s;%.1f%n&amp;#34;&lt;/span&gt;, station, temp));
            }
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; path;
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@FunctionalInterface&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ThrowingRunnable&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;run&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Run this. Watch your CPU utilization jump from 60% to 95%.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;day-100-what-i-learned-about-performance&#34;&gt;Day 100: what I learned about performance&lt;/h2&gt;
&lt;p&gt;Optimization is a ladder: right algorithm, right data structures, right concurrency, then constants (allocation, parsing, copying), then the metal (&lt;code&gt;Unsafe&lt;/code&gt;, SIMD, native). Most code never gets past step 2. Some needs step 3. Very little needs 4 or 5.&lt;/p&gt;
&lt;p&gt;Fixed-batch spliterators sit around 3.5. Fifty lines, 40% faster. The 1BRC made it clear there&amp;rsquo;s always another level—custom parsing, memory-mapped I/O, thread-local aggregation, &lt;code&gt;Unsafe&lt;/code&gt;, GraalVM. Each step is harder and pays off less. Knowing when to stop is the part nobody teaches.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;nb&#34;&gt;N.B&lt;/h2&gt;
&lt;p&gt;Later this problem with stream imbalance split was fixed in openJDK in this &lt;a href=&#34;https://bugs.openjdk.org/browse/JDK-8280915&#34;&gt;enhancement&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;p&gt;Details and inspiration from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gunnarmorling/1brc&#34;&gt;One Billion Row Challenge Repository&lt;/a&gt; - Gunnar Morling&amp;rsquo;s challenge and leaderboard&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20210207202033/https://www.airpair.com/java/posts/parallel-processing-of-io-based-data-with-java-streams&#34;&gt;Parallel Processing of I/O-Based Data with Java Streams&lt;/a&gt; - Marko Topolnik&amp;rsquo;s original fixed-batch spliterator article&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Spliterator.html&#34;&gt;Java Spliterator Documentation&lt;/a&gt; - Official Java documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openjdk.org/jeps/266&#34;&gt;JEP 266: More Concurrency Updates&lt;/a&gt; - Background on Java concurrency improvements&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://questdb.io/blog/billion-row-challenge-step-by-step/&#34;&gt;1BRC Solutions Analysis&lt;/a&gt; - Detailed breakdown of optimization techniques&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.oracle.com/java/technologies/javase/performance-tuning.html&#34;&gt;Java Performance Tuning Guide&lt;/a&gt; - Oracle&amp;rsquo;s performance best practices&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Day 98: I Thought Virtual Threads Were Just Green Threads They&#39;re Actually Continuations on the Heap</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day98/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day98/</id>
    <published>2025-12-23T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">I thought virtual threads were just green threads—turns out they&amp;rsquo;re continuations on the heap with sophisticated scheduling. Here&amp;rsquo;s what I got wrong and what actually happens under the hood.</summary>
    <content type="html">&lt;h2 id=&#34;i-thought-virtual-threads-were-just-green-threadstheyre-actually-continuations-on-the-heap&#34;&gt;I Thought Virtual Threads Were Just Green Threads—They&amp;rsquo;re Actually Continuations on the Heap&lt;/h2&gt;
&lt;p&gt;I used virtual threads in an API earlier in this challenge. Spun up a few thousand threads, watched memory stay flat, called it a win. My mental model was simple: virtual threads are like Go&amp;rsquo;s goroutines—lightweight threads the runtime manages instead of the OS. Green threads. Done.&lt;/p&gt;
&lt;p&gt;For thos who want to learn more about goroutines you can look into these videos to learn more about concurrency in go
&lt;a href=&#34;http://youtube.com/watch?v=5zXAHh5tJqQ&#34;&gt;http://youtube.com/watch?v=5zXAHh5tJqQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then I tried to understand &lt;em&gt;why&lt;/em&gt; a &lt;code&gt;synchronized&lt;/code&gt; block could pin a virtual thread in Java 21 but not in Java 24.&lt;/p&gt;
&lt;p&gt;Before that lets know what is pinnig a thread means. Pinning, the binding of a process or thread to a specific core, can improve the performance of your code by increasing the percentage of local memory accesses. But in java it is &lt;em&gt;preventing a virtual thread from being unmounted from its carrier thread&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That question pulled me into the underlying implementation, and I realized my mental model was completely wrong. Virtual threads aren&amp;rsquo;t just &amp;ldquo;lighter&amp;rdquo; OS threads. They&amp;rsquo;re heap-allocated continuation objects with their own stack chunks, scheduled by a work-stealing ForkJoinPool, with mount/unmount semantics&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I got wrong and what actually happens under the hood.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-mental-model-i-had-wrong&#34;&gt;The Mental Model I Had (Wrong)&lt;/h2&gt;
&lt;p&gt;Before this deep dive, here&amp;rsquo;s what I thought:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Virtual threads = JVM-managed lightweight threads (like goroutines)&lt;/li&gt;
&lt;li&gt;Main benefit = no 1MB stack reservation per thread&lt;/li&gt;
&lt;li&gt;They &amp;ldquo;just work&amp;rdquo; with existing blocking code&lt;/li&gt;
&lt;li&gt;Implementation details = &amp;ldquo;JVM magic&amp;rdquo; I didn&amp;rsquo;t need to understand&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This model worked for basic usage. I could write &lt;code&gt;Thread.ofVirtual().start(() -&amp;gt; ...)&lt;/code&gt; and handle thousands of concurrent requests without thinking about thread pools. Good enough.&lt;/p&gt;
&lt;p&gt;But it didn&amp;rsquo;t explain the weird constraints I kept seeing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why does &lt;code&gt;synchronized&lt;/code&gt; pin threads in Java 21?&lt;/li&gt;
&lt;li&gt;Why do people say &amp;ldquo;use ReentrantLock instead&amp;rdquo;?&lt;/li&gt;
&lt;li&gt;Why does the documentation warn about ThreadLocal with millions of threads?&lt;/li&gt;
&lt;li&gt;Why are stacks on the heap instead of&amp;hellip; wherever stacks normally live?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &amp;ldquo;green threads&amp;rdquo; model had no answers. Time to dig deeper.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-virtual-threads-actually-are-continuations&#34;&gt;What Virtual Threads Actually Are: Continuations&lt;/h2&gt;
&lt;p&gt;The core primitive isn&amp;rsquo;t a thread at all—it&amp;rsquo;s a &lt;strong&gt;continuation&lt;/strong&gt;. This is the part that broke my mental model.&lt;/p&gt;
&lt;p&gt;A continuation is a Java object that captures execution state: local variables, method call frames, the instruction pointer. When a virtual thread blocks on I/O, the JVM doesn&amp;rsquo;t let it block the underlying OS thread. Instead, the continuation object captures the current state, the virtual thread &amp;ldquo;unmounts&amp;rdquo; from its carrier thread, and the carrier becomes available for other virtual threads.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the internal API (not accessible to user code, but this is what happens):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// What the JVM does internally when you create a virtual thread
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;var scope = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ContinuationScope(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;VirtualThreads&amp;#34;&lt;/span&gt;);
var continuation = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Continuation(scope, () -&amp;gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Your code runs here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    socket.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;();  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocking operation triggers yield
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Execution resumes here later, possibly on different carrier
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When &lt;code&gt;socket.read()&lt;/code&gt; blocks, the continuation calls &lt;code&gt;yield(scope)&lt;/code&gt;. This doesn&amp;rsquo;t block the OS thread—it saves the execution state to the heap and returns control to the scheduler. Later, when the I/O completes, the scheduler picks an available carrier thread and resumes the continuation from where it left off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is not how platform threads work.&lt;/strong&gt; Platform threads block the OS thread. The OS kernel handles the context switch. With virtual threads, the JVM handles everything in user space.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1768479106/virtual_thread_inner_working_gs7pjt.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;the-stack-problem-why-heap-allocation-matters&#34;&gt;The Stack Problem: Why Heap Allocation Matters&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the memory efficiency piece I thought I understood but didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Platform threads allocate their stacks in native OS memory—typically 1MB reserved at creation time, whether you use it or not. If you create 10,000 platform threads, you&amp;rsquo;ve reserved 10GB of native memory for stacks alone, even if most threads are blocked waiting for I/O with shallow call stacks.&lt;/p&gt;
&lt;p&gt;Virtual threads store their stacks as &lt;strong&gt;stack chunk objects&lt;/strong&gt; on the garbage-collected heap. These chunks grow dynamically based on actual call depth:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shallow I/O operation: ~1KB heap allocation&lt;/li&gt;
&lt;li&gt;Deep call chain: ~50KB heap allocation&lt;/li&gt;
&lt;li&gt;Deeply recursive algorithm: up to ~512KB (G1 GC region size limit)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The math changes dramatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10,000 platform threads: ~10GB native memory (reserved, not used)&lt;/li&gt;
&lt;li&gt;10,000 virtual threads: ~10MB heap memory (actual usage)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But here&amp;rsquo;s the part I missed: &lt;strong&gt;this creates work during mount/unmount operations&lt;/strong&gt;. When a virtual thread mounts on a carrier, the JVM copies stack frames from the heap to the carrier&amp;rsquo;s native stack. When it unmounts, frames copy back to the heap. This is fast (1-5 microseconds) but not free.&lt;/p&gt;
&lt;p&gt;The trade-off: memory efficiency for CPU overhead during context switches. For I/O-bound workloads where threads spend most of their time blocked, this trade-off is massively in your favor. For CPU-bound workloads, you&amp;rsquo;re just burning cycles copying stacks around.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-scheduler-forkjoinpool-in-fifo-mode&#34;&gt;The Scheduler: ForkJoinPool in FIFO Mode&lt;/h2&gt;
&lt;p&gt;I assumed virtual threads had some custom scheduler. Nope—it&amp;rsquo;s a ForkJoinPool, the same work-stealing pool used by parallel streams, but configured differently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key differences from the common pool:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FIFO mode instead of LIFO (better for long-running tasks)&lt;/li&gt;
&lt;li&gt;Default parallelism = number of CPU cores&lt;/li&gt;
&lt;li&gt;Dynamically expands when threads pin (more on this shortly)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The work-stealing algorithm means idle carrier threads steal virtual threads from busy carriers&#39; queues. This keeps all carriers busy and improves utilization.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the critical constraint: &lt;strong&gt;virtual threads are cooperative, not preemptive&lt;/strong&gt;. If a virtual thread runs CPU-bound code without calling any blocking operations, it monopolizes its carrier. No time-slicing. No forced context switch. This can starve other virtual threads.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always had preemptive thread scheduling. Virtual threads don&amp;rsquo;t work that way. If you have a CPU-bound task, use a platform thread or parallel stream. Virtual threads are for I/O-bound concurrency.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-pinning-problem-and-why-java-24-matters&#34;&gt;The Pinning Problem (And Why Java 24 Matters)&lt;/h2&gt;
&lt;p&gt;This is where my &amp;ldquo;green threads&amp;rdquo; model completely fell apart.&lt;/p&gt;
&lt;p&gt;In Java 21-23, if a virtual thread blocks inside a &lt;code&gt;synchronized&lt;/code&gt; block, it &lt;strong&gt;pins&lt;/strong&gt; to its carrier thread. The virtual thread cannot unmount. The carrier thread blocks. You&amp;rsquo;ve just turned your virtual thread back into a platform thread, defeating the entire purpose.&lt;/p&gt;
&lt;p&gt;Why? Because &lt;code&gt;synchronized&lt;/code&gt; monitors are tied to the OS thread identity. The JVM couldn&amp;rsquo;t separate the monitor state from the carrier thread. If the virtual thread unmounted, the monitor would be released incorrectly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is a massive problem&lt;/strong&gt; if you&amp;rsquo;re working with legacy code full of &lt;code&gt;synchronized&lt;/code&gt; blocks. Your virtual threads pin constantly, the scheduler compensates by expanding the carrier pool beyond the CPU count, and you end up with hundreds of OS threads anyway.&lt;/p&gt;
&lt;p&gt;The workaround in Java 21: replace &lt;code&gt;synchronized&lt;/code&gt; with &lt;code&gt;ReentrantLock&lt;/code&gt;, which properly unmounts virtual threads. But that&amp;rsquo;s a non-trivial refactor if you have thousands of synchronized methods.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Java 24 (JEP 491) fixes this.&lt;/strong&gt; Virtual threads can now hold monitors independently of their carriers. When a virtual thread blocks inside &lt;code&gt;synchronized&lt;/code&gt; code, it unmounts normally. The monitor state is tracked by the JVM, not the carrier thread. When the lock is acquired, the virtual thread resumes on any available carrier.&lt;/p&gt;
&lt;p&gt;This was the implementation detail that made me realize how sophisticated this system is. The JVM had to fundamentally change how monitors work to make virtual threads scale with real-world Java code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-i-measured-and-what-surprised-me&#34;&gt;What I Measured (And What Surprised Me)&lt;/h2&gt;
&lt;p&gt;I wanted to see the memory difference myself, so I wrote a simple test:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Platform threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService platformPool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(200);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10_000; i++) {
    platformPool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(10_000); } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {}
    });
}
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Result: ~200MB native memory (200 threads × 1MB stacks)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 9,800 tasks queued, waiting for threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Virtual threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService virtualPool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newVirtualThreadPerTaskExecutor&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10_000; i++) {
    virtualPool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(10_000); } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {}
    });
}
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Result: ~10MB heap memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// All 10,000 threads sleeping concurrently
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The platform thread version queues 9,800 tasks because only 200 threads exist. The virtual thread version runs all 10,000 concurrently because creating threads is cheap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What surprised me:&lt;/strong&gt; CPU utilization with virtual threads was higher (85% vs 60%) on an I/O-bound workload. The platform thread pool left cores idle waiting for threads to unblock. Virtual threads kept carriers busy by unmounting blocked threads and scheduling runnable ones.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-trade-offs-i-didnt-expect&#34;&gt;The Trade-offs I Didn&amp;rsquo;t Expect&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Virtual threads are not always better.&lt;/strong&gt; Here&amp;rsquo;s what I learned:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use virtual threads when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I/O-bound workloads (network calls, database queries, file I/O)&lt;/li&gt;
&lt;li&gt;You need millions of concurrent operations&lt;/li&gt;
&lt;li&gt;Blocking code is simpler than async pipelines&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re on Java 24+ (or can avoid &lt;code&gt;synchronized&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Use platform threads when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU-bound workloads (no blocking = no benefit from unmounting)&lt;/li&gt;
&lt;li&gt;You need thread priorities or custom scheduling&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re calling native code frequently (FFM/JNI pins threads)&lt;/li&gt;
&lt;li&gt;You have deeply recursive algorithms (stack size limits)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The ThreadLocal trap:&lt;/strong&gt; If you use ThreadLocal variables with millions of virtual threads, you&amp;rsquo;re allocating millions of ThreadLocal entries on the heap. This can create memory pressure. Java 21 introduced Scoped Values as a better alternative for virtual thread scenarios—lexically scoped, no per-thread allocation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The debugging challenge:&lt;/strong&gt; Thread dumps with millions of virtual threads are&amp;hellip; interesting. The new JSON format helps, but tooling is still catching up. Structured concurrency (preview feature) helps by establishing task hierarchies debuggers can visualize.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-ill-do-differently&#34;&gt;What I&amp;rsquo;ll Do Differently&lt;/h2&gt;
&lt;p&gt;Before this deep dive, I treated virtual threads as a drop-in replacement for thread pools. Now I know better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For new I/O-bound services:&lt;/strong&gt; Virtual threads by default. The simplicity of thread-per-request code with the scalability of async systems is worth it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For existing services:&lt;/strong&gt; Check for &lt;code&gt;synchronized&lt;/code&gt; blocks first. If we&amp;rsquo;re on Java 24+, virtual threads are safe. If we&amp;rsquo;re stuck on Java 21-23, I need to profile for pinning (&lt;code&gt;-Djdk.tracePinnedThreads=full&lt;/code&gt;) and decide if the refactor to &lt;code&gt;ReentrantLock&lt;/code&gt; is worth it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For CPU-bound tasks:&lt;/strong&gt; Stick with platform threads or parallel streams. Virtual threads add overhead without benefit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For mixed workloads:&lt;/strong&gt; Separate pools. Virtual threads for I/O, platform threads for CPU work. Don&amp;rsquo;t mix them in the same executor.&lt;/p&gt;
&lt;p&gt;The mental model shift matters. Virtual threads aren&amp;rsquo;t just &amp;ldquo;lighter threads&amp;rdquo;—they&amp;rsquo;re a different concurrency model with different trade-offs. Understanding continuations, heap-based stacks, and the mount/unmount mechanism helps me make better architectural decisions.&lt;/p&gt;
&lt;p&gt;Next time I see a service hitting thread pool limits, I&amp;rsquo;ll know exactly why virtual threads might help—and when they won&amp;rsquo;t.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;p&gt;Technical details verified against:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://openjdk.org/jeps/444&#34;&gt;JEP 444: Virtual Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openjdk.org/jeps/491&#34;&gt;JEP 491: Synchronize Virtual Threads Without Pinning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://foojay.io/today/the-basis-of-virtual-threads-continuations/&#34;&gt;Foojay: Continuations Foundation of Virtual Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blogs.oracle.com/javamagazine/java-virtual-threads/&#34;&gt;Oracle Java Magazine: Virtual Threads Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nipafx.dev/inside-java-newscast-23/&#34;&gt;nipafx: Virtual Thread Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://andrewbaker.ninja/2025/12/03/a-deep-dive-into-java-25-virtual-threads-from-thread-per-request-to-lightweight-concurrency/&#34;&gt;InfoQ: Virtual Threads Lightweight Concurrency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cashfree.com/blog/java-21-virtual-threads-lessons-production/&#34;&gt;Cashfree: Production Lessons from Virtual Threads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.ycrash.io/an-investigative-study-virtual-threads-vs-platform-threads-in-java-23/&#34;&gt;YCrash: Virtual Threads vs Platform Threads Study&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.stackademic.com/from-1000-tps-to-5000-tps-real-benchmarking-virtual-threads-hikaricp-in-spring-boot-with-4f3199fd4e92&#34;&gt;Stackademic: Spring Boot Virtual Threads Benchmarking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://norma.ncirl.ie/8134/1/visheshpandita.pdf&#34;&gt;Academic Study: Virtual Threads Performance Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Day 97: Java Concurrency Toolkit Part 3 - Advanced Patterns &amp; Production Readiness</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day97/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day97/</id>
    <published>2025-12-22T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Part 3: Advanced Patterns &amp;amp; Production Readiness - Deep dive into 3 advanced tools plus debugging, monitoring, and going to production</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series Navigation:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day95&#34;&gt;Part 1: Foundation &amp;amp; Execution&lt;/a&gt; • &lt;a href=&#34;/posts/java/100DaysOfJava/day96&#34;&gt;Part 2: Core Synchronization&lt;/a&gt; • &lt;a href=&#34;#&#34;&gt;Part 3 (You are here)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Mastering concurrency means knowing when NOT to use these tools, and how to debug them when things break.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;/posts/java/100DaysOfJava/day95&#34;&gt;Part 1 (Day 95)&lt;/a&gt;, we explored &lt;strong&gt;execution patterns&lt;/strong&gt;. In &lt;a href=&#34;/posts/java/100DaysOfJava/day96&#34;&gt;Part 2 (Day 96)&lt;/a&gt;, we covered &lt;strong&gt;core synchronization tools&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now in &lt;strong&gt;Part 3&lt;/strong&gt;, we tackle &lt;strong&gt;advanced patterns&lt;/strong&gt; and the critical skills for &lt;strong&gt;production systems&lt;/strong&gt;: debugging, monitoring, and operational readiness.&lt;/p&gt;
&lt;h2 id=&#34;series-overview&#34;&gt;Series Overview&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;3-part series&lt;/strong&gt; on Java Concurrency:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1 (Day 95):&lt;/strong&gt; Foundation &amp;amp; Execution&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Executor, ExecutorService, ScheduledExecutorService&lt;/li&gt;
&lt;li&gt;Future, CompletableFuture, CountDownLatch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 2 (Day 96):&lt;/strong&gt; Core Synchronization Patterns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CyclicBarrier, Semaphore, ThreadFactory, BlockingQueue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 3 (Today - Day 97):&lt;/strong&gt; Advanced Patterns &amp;amp; Production Readiness&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DelayQueue, ReentrantLock, Phaser&lt;/li&gt;
&lt;li&gt;Debugging, Monitoring, Production Patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-were-covering-today&#34;&gt;What We&amp;rsquo;re Covering Today&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Part 3 (Today):&lt;/strong&gt; Advanced Patterns &amp;amp; Production Readiness&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DelayQueue - Time-delayed execution with exponential backoff&lt;/li&gt;
&lt;li&gt;ReentrantLock - Fine-grained locking control&lt;/li&gt;
&lt;li&gt;Phaser - Dynamic multi-phase coordination&lt;/li&gt;
&lt;li&gt;Debugging Concurrent Code&lt;/li&gt;
&lt;li&gt;Monitoring Concurrent Systems&lt;/li&gt;
&lt;li&gt;Production Readiness Checklist&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;quick-reference-part-3-tools-at-a-glance&#34;&gt;Quick Reference: Part 3 Tools at a Glance&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;TL;DR&lt;/th&gt;
&lt;th&gt;Key Gotcha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DelayQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queue where items become available after a delay. Built for exponential backoff retries.&lt;/td&gt;
&lt;td&gt;Unbounded (grows indefinitely). Requires &lt;code&gt;Delayed&lt;/code&gt; interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ReentrantLock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Explicit locking with timeouts, interruptibility, fair mode. More power than &lt;code&gt;synchronized&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Must unlock in &lt;code&gt;finally&lt;/code&gt; - no automatic unlock on exception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phaser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Most advanced - dynamic party registration/deregistration, multiple phases.&lt;/td&gt;
&lt;td&gt;Most complex synchronizer. Use only when CountDownLatch/CyclicBarrier won&amp;rsquo;t work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;1-delayqueue-exponential-backoff-retry&#34;&gt;1. DelayQueue: Exponential Backoff Retry&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; HTTP requests fail intermittently. Retry immediately and you overwhelm the failing service. Wait too long and users timeout.&lt;/p&gt;
&lt;p&gt;DelayQueue holds tasks until a delay expires. Tasks become available for processing only after their delay passes. No manual sleep() calls needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Each task stores its trigger time. &lt;code&gt;take()&lt;/code&gt; call blocks until a task&amp;rsquo;s delay expires.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;91
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;RetryQueue&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;RetryTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Delayed {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String payload;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; triggerTime;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; attemptNumber;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;RetryTask&lt;/span&gt;(String payload, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; delayMs, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; attemptNumber) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;payload&lt;/span&gt; = payload;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;triggerTime&lt;/span&gt; = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;() + delayMs;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;attemptNumber&lt;/span&gt; = attemptNumber;
        }
        
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; diff = triggerTime - System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; unit.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(diff, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;);
        }
        
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compareTo&lt;/span&gt;(Delayed other) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Long.&lt;span style=&#34;color:#bbb&#34;&gt;compare&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;triggerTime&lt;/span&gt;, ((RetryTask) other).&lt;span style=&#34;color:#bbb&#34;&gt;triggerTime&lt;/span&gt;);
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getPayload&lt;/span&gt;() { &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; payload; }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getAttemptNumber&lt;/span&gt;() { &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; attemptNumber; }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; DelayQueue&amp;lt;RetryTask&amp;gt; retryQueue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService worker;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxRetries;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;RetryQueue&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxRetries) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;retryQueue&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DelayQueue&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;worker&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadExecutor&lt;/span&gt;(
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;retry-worker&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;)
        );
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;maxRetries&lt;/span&gt; = maxRetries;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;start&lt;/span&gt;() {
        worker.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (!Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;isInterrupted&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks until a task&amp;#39;s delay expires
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    RetryTask task = retryQueue.&lt;span style=&#34;color:#bbb&#34;&gt;take&lt;/span&gt;();
                    
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Attempting delivery (attempt &amp;#34;&lt;/span&gt; + task.&lt;span style=&#34;color:#bbb&#34;&gt;getAttemptNumber&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;): &amp;#34;&lt;/span&gt; + 
                                     task.&lt;span style=&#34;color:#bbb&#34;&gt;getPayload&lt;/span&gt;());
                    
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; success = sendWebhook(task.&lt;span style=&#34;color:#bbb&#34;&gt;getPayload&lt;/span&gt;());
                    
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!success &amp;amp;&amp;amp; task.&lt;span style=&#34;color:#bbb&#34;&gt;getAttemptNumber&lt;/span&gt;() &amp;lt; maxRetries) {
                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Exponential backoff: 2^attempt seconds
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; backoffMs = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;) Math.&lt;span style=&#34;color:#bbb&#34;&gt;pow&lt;/span&gt;(2, task.&lt;span style=&#34;color:#bbb&#34;&gt;getAttemptNumber&lt;/span&gt;()) * 1000;
                        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Delivery failed. Retrying in &amp;#34;&lt;/span&gt; + backoffMs + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
                        
                        retryQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RetryTask(
                            task.&lt;span style=&#34;color:#bbb&#34;&gt;getPayload&lt;/span&gt;(),
                            backoffMs,
                            task.&lt;span style=&#34;color:#bbb&#34;&gt;getAttemptNumber&lt;/span&gt;() + 1
                        ));
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (success) {
                        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Delivery successful!&amp;#34;&lt;/span&gt;);
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Max retries exceeded. Giving up.&amp;#34;&lt;/span&gt;);
                    }
                    
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
                    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                }
            }
        });
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;scheduleDelivery&lt;/span&gt;(String payload) {
        retryQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RetryTask(payload, 0, 1));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sendWebhook&lt;/span&gt;(String payload) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate random failures
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextDouble&lt;/span&gt;() &amp;gt; 0.&lt;span style=&#34;color:#bbb&#34;&gt;3&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        worker.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Production note:&lt;/strong&gt; This queue lives in memory. Application restart loses pending retries. Persist to Redis or a database if retries must survive restarts.&lt;/p&gt;
&lt;h3 id=&#34;trade-offs&#34;&gt;Trade-offs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatic delay enforcement. No manual sleep() or timers.&lt;/li&gt;
&lt;li&gt;Tasks ordered by trigger time. Earliest task dequeues first.&lt;/li&gt;
&lt;li&gt;Thread-safe. Multiple consumers can call take() concurrently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you pay:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unbounded. No backpressure. Queue grows until memory exhausted.&lt;/li&gt;
&lt;li&gt;Clock-dependent. System time changes affect delays.&lt;/li&gt;
&lt;li&gt;CPU overhead. Internal heap reorders on every insert.&lt;/li&gt;
&lt;li&gt;Boilerplate. Must implement Delayed interface for every task type.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Critical implementation detail:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Stores relative delay
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BadDelayedTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Delayed {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; delay; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 5000ms
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; unit.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(delay, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Always returns 5000ms. Task never becomes available.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Stores absolute trigger time
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;GoodDelayedTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Delayed {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; triggerTime; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// System.currentTimeMillis() + 5000
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; remaining = triggerTime - System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; unit.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(remaining, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Returns decreasing value. Negative = ready now.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Missing compareTo
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BadTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Delayed {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*...*/&lt;/span&gt; }
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compiles fine. Throws ClassCastException when queue reorders.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: compareTo orders the internal heap
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;GoodTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Delayed {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*...*/&lt;/span&gt; }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compareTo&lt;/span&gt;(Delayed other) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Long.&lt;span style=&#34;color:#bbb&#34;&gt;compare&lt;/span&gt;(
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getDelay&lt;/span&gt;(TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;),
            other.&lt;span style=&#34;color:#bbb&#34;&gt;getDelay&lt;/span&gt;(TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;)
        );
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Earliest trigger time = highest priority
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Negative delays are correct behavior
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getDelay&lt;/span&gt;(TimeUnit unit) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; remaining = triggerTime - System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; unit.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(remaining, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;);
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Negative = trigger time passed. Task ready immediately.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Zero = trigger time is now. Task ready immediately.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Positive = trigger time in future. Task blocks.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;production-pattern-circuit-breaker-with-retry&#34;&gt;Production Pattern: Circuit Breaker with Retry&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CircuitBreakerRetry&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; DelayQueue&amp;lt;RetryTask&amp;gt; retryQueue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger failureCount = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(0);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; circuitOpen = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;execute&lt;/span&gt;(String request) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (circuitOpen) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CircuitOpenException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Circuit is open&amp;#34;&lt;/span&gt;);
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            callExternalService(request);
            failureCount.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(0); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reset on success
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; failures = failureCount.&lt;span style=&#34;color:#bbb&#34;&gt;incrementAndGet&lt;/span&gt;();
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (failures &amp;gt;= 5) {
                circuitOpen = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                scheduleCircuitReset();
            }
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Schedule retry with exponential backoff
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; delayMs = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;) Math.&lt;span style=&#34;color:#bbb&#34;&gt;pow&lt;/span&gt;(2, failures) * 1000;
            retryQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RetryTask(request, delayMs, failures));
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;scheduleCircuitReset&lt;/span&gt;() {
        retryQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RetryTask(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;RESET_CIRCUIT&amp;#34;&lt;/span&gt;, 30000, 0));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;2-reentrantlock-fine-grained-control&#34;&gt;2. ReentrantLock: Fine-Grained Control&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Multiple threads update a shared resource. &lt;code&gt;synchronized&lt;/code&gt; blocks forever if the lock is held. You need timeouts, interruptibility, or fair queueing.&lt;/p&gt;
&lt;p&gt;ReentrantLock provides explicit locking with timeout and interruption support. More verbose than &lt;code&gt;synchronized&lt;/code&gt;, but you control when to give up waiting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key mechanism:&lt;/strong&gt; &lt;code&gt;tryLock(timeout)&lt;/code&gt; returns false if lock isn&amp;rsquo;t acquired within the timeout. Thread doesn&amp;rsquo;t block indefinitely.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.locks.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.TimeUnit&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConfigurationManager&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Lock configLock = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ReentrantLock(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// fair lock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path configFile;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String cachedConfig;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ConfigurationManager&lt;/span&gt;(Path configFile) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;configFile&lt;/span&gt; = configFile;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;updateConfig&lt;/span&gt;(String newConfig) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Try to acquire lock with timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (configLock.&lt;span style=&#34;color:#bbb&#34;&gt;tryLock&lt;/span&gt;(5, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Updating config...&amp;#34;&lt;/span&gt;);
                    
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Write to file
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    Files.&lt;span style=&#34;color:#bbb&#34;&gt;writeString&lt;/span&gt;(configFile, newConfig);
                    
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Update cache
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    cachedConfig = newConfig;
                    
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate some processing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(1000);
                    
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Config updated&amp;#34;&lt;/span&gt;);
                    
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                    configLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ALWAYS in finally block
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + 
                                 &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Could not acquire lock within 5 seconds&amp;#34;&lt;/span&gt;);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Interrupted while waiting for lock&amp;#34;&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Config update failed: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;readConfig&lt;/span&gt;() {
        configLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (cachedConfig == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                cachedConfig = Files.&lt;span style=&#34;color:#bbb&#34;&gt;readString&lt;/span&gt;(configFile);
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; cachedConfig;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error reading config&amp;#34;&lt;/span&gt;;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            configLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Advanced: Check lock status without blocking
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isConfigBeingUpdated&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ((ReentrantLock) configLock).&lt;span style=&#34;color:#bbb&#34;&gt;isLocked&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Why not synchronized?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; blocks forever if the lock is held. No timeout. No interruption. No way to check if locked without blocking.&lt;/p&gt;
&lt;p&gt;ReentrantLock adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tryLock(timeout)&lt;/code&gt; - give up after N seconds&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lockInterruptibly()&lt;/code&gt; - thread can be interrupted while waiting&lt;/li&gt;
&lt;li&gt;Fair mode - threads acquire lock in request order (prevents starvation)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isLocked()&lt;/code&gt; - check status without blocking&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;trade-offs-1&#34;&gt;Trade-offs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Timeout support. Fail fast instead of blocking forever.&lt;/li&gt;
&lt;li&gt;Interruptibility. Shutdown threads cleanly mid-wait.&lt;/li&gt;
&lt;li&gt;Fair mode. Prevent thread starvation under contention.&lt;/li&gt;
&lt;li&gt;Condition variables. Multiple wait queues per lock.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you pay:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual unlock. Forget &lt;code&gt;finally&lt;/code&gt; block = permanent lock.&lt;/li&gt;
&lt;li&gt;More verbose. 5 lines vs 1 for synchronized.&lt;/li&gt;
&lt;li&gt;Deadlock risk unchanged. Lock ordering still matters.&lt;/li&gt;
&lt;li&gt;No compiler help. synchronized checks happen at bytecode level.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;synchronized vs ReentrantLock:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;synchronized&lt;/th&gt;
&lt;th&gt;ReentrantLock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timeout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ tryLock(timeout)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interruptible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ lockInterruptibly()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fair mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ new ReentrantLock(true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Try without blocking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ tryLock()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Condition variables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ (wait/notify only)&lt;/td&gt;
&lt;td&gt;✅ newCondition()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic unlock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (must use finally)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slightly better&lt;/td&gt;
&lt;td&gt;Slightly worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Failure modes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Exception skips unlock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;lock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
doWork(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Throws IOException
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;lock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Never executes. Lock held forever.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// All other threads block forever on this lock.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: finally guarantees unlock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;lock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    doWork();
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
    lock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Runs even if doWork() throws
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Inconsistent lock order causes deadlock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1: transfer(accountA, accountB, 100)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(accountA) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(accountB) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/* transfer */&lt;/span&gt; }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 2: transfer(accountB, accountA, 50)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(accountB) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(accountA) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/* transfer */&lt;/span&gt; }
}
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1 holds A, waits for B
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 2 holds B, waits for A
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Deadlock. Both threads blocked forever.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Always acquire locks in same order
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Lock first = getLockById(Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(idA, idB));
Lock second = getLockById(Math.&lt;span style=&#34;color:#bbb&#34;&gt;max&lt;/span&gt;(idA, idB));
first.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    second.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        second.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
    }
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
    first.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
}
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Both threads acquire locks in ascending ID order. No circular wait.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: tryLock without finally
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (lock.&lt;span style=&#34;color:#bbb&#34;&gt;tryLock&lt;/span&gt;()) {
    doWork(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Throws exception
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    lock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Never executes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Lock held forever
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: tryLock with finally
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (lock.&lt;span style=&#34;color:#bbb&#34;&gt;tryLock&lt;/span&gt;()) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        lock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Runs even if doWork() throws
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Lock was held. Handle failure.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Ignoring interruption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;lock.&lt;span style=&#34;color:#bbb&#34;&gt;lockInterruptibly&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Throws InterruptedException - must catch
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Restore interrupt status
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    lock.&lt;span style=&#34;color:#bbb&#34;&gt;lockInterruptibly&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        lock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
    }
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Restore flag
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread was interrupted. Exit gracefully.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;advanced-pattern-read-write-lock&#34;&gt;Advanced Pattern: Read-Write Lock&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CachedData&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ReadWriteLock rwLock = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ReentrantReadWriteLock();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Lock readLock = rwLock.&lt;span style=&#34;color:#bbb&#34;&gt;readLock&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Lock writeLock = rwLock.&lt;span style=&#34;color:#bbb&#34;&gt;writeLock&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Map&amp;lt;String, String&amp;gt; cache = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;read&lt;/span&gt;(String key) {
        readLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Multiple readers allowed
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; cache.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(key);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            readLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;write&lt;/span&gt;(String key, String value) {
        writeLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Exclusive access
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            cache.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(key, value);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            writeLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Upgrade pattern: read -&amp;gt; write (tricky!)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;updateIfNeeded&lt;/span&gt;(String key, String newValue) {
        readLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            String current = cache.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (needsUpdate(current, newValue)) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Release read lock before acquiring write lock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                readLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
                writeLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Re-check after acquiring write lock
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    current = cache.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(key);
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (needsUpdate(current, newValue)) {
                        cache.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(key, newValue);
                    }
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Downgrade: acquire read lock before releasing write
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    readLock.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                    writeLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
                }
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            readLock.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-phaser-dynamic-multi-phase-coordination&#34;&gt;3. Phaser: Dynamic Multi-Phase Coordination&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; ETL pipeline with Extract → Transform → Load phases. Workers join when data arrives. Workers leave when their partition completes. Party count changes during execution.&lt;/p&gt;
&lt;p&gt;CountDownLatch: Fixed count at creation. Cannot add parties.
CyclicBarrier: Fixed parties. Cannot add or remove.
Phaser: Parties register and deregister during execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Each worker calls &lt;code&gt;register()&lt;/code&gt; on arrival and &lt;code&gt;arriveAndDeregister()&lt;/code&gt; on completion. Phaser tracks current party count. Phase advances when all registered parties arrive.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.IntStream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ETLPipeline&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ETLWorker&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Runnable {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Phaser phaser;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; workerId;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ETLWorker&lt;/span&gt;(Phaser phaser, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; workerId) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phaser&lt;/span&gt; = phaser;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;workerId&lt;/span&gt; = workerId;
            phaser.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Register this worker
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
        
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;run&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Starting EXTRACT phase&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - EXTRACT complete&amp;#34;&lt;/span&gt;);
                
                phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndAwaitAdvance&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all workers to finish extract
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Starting TRANSFORM phase&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - TRANSFORM complete&amp;#34;&lt;/span&gt;);
                
                phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndAwaitAdvance&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all workers to finish transform
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Starting LOAD phase&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker-&amp;#34;&lt;/span&gt; + workerId + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - LOAD complete&amp;#34;&lt;/span&gt;);
                
                phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndDeregister&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Complete and leave
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
            }
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;runPipeline&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create phaser with 1 party (main thread)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Phaser phaser = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Phaser(1) {
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onAdvance&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; phase, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; registeredParties) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n=== Phase &amp;#34;&lt;/span&gt; + phase + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; completed. &amp;#34;&lt;/span&gt; + 
                                 registeredParties + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; parties registered ===\n&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Continue to next phase
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            }
        };
        
        ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(4);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Start initial workers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0, 4).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(i -&amp;gt; 
            pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ETLWorker(phaser, i))
        );
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate dynamic worker joining mid-process
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(2000);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n&amp;gt;&amp;gt;&amp;gt; NEW WORKER JOINING &amp;lt;&amp;lt;&amp;lt;\n&amp;#34;&lt;/span&gt;);
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ETLWorker(phaser, 99));
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Main thread deregisters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndDeregister&lt;/span&gt;();
        
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MINUTES&lt;/span&gt;);
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\nETL Pipeline complete!&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;When to use Phaser:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parties join/leave during execution&lt;/li&gt;
&lt;li&gt;More than 2 phases&lt;/li&gt;
&lt;li&gt;Need phase number tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;When NOT to use:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed party count → Use CountDownLatch or CyclicBarrier&lt;/li&gt;
&lt;li&gt;Single phase → Use CountDownLatch&lt;/li&gt;
&lt;li&gt;Adds complexity. Only use when simpler tools don&amp;rsquo;t fit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;trade-offs-2&#34;&gt;Trade-offs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What you gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic parties. Add workers mid-execution. Remove when done.&lt;/li&gt;
&lt;li&gt;Unlimited phases. CountDownLatch is one-shot. CyclicBarrier resets but doesn&amp;rsquo;t track phase number.&lt;/li&gt;
&lt;li&gt;Phase callbacks. &lt;code&gt;onAdvance()&lt;/code&gt; runs between phases.&lt;/li&gt;
&lt;li&gt;Termination control. Return true from &lt;code&gt;onAdvance()&lt;/code&gt; to stop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What you pay:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complexity. Hardest synchronizer to reason about.&lt;/li&gt;
&lt;li&gt;Register/deregister bugs. Forget to deregister = phase never advances.&lt;/li&gt;
&lt;li&gt;Higher overhead. Atomic operations on every arrive() call.&lt;/li&gt;
&lt;li&gt;Debugging difficulty. Thread dump shows &amp;ldquo;waiting on Phaser&amp;rdquo; but not which phase.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Failure modes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Arrive without registering
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Phaser phaser = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Phaser(1);
pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndAwaitAdvance&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// IllegalStateException
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread never registered. Phaser doesn&amp;#39;t know about it.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Register before arriving
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Worker&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Runnable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Phaser phaser;
    
    Worker(Phaser phaser) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phaser&lt;/span&gt; = phaser;
        phaser.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Increment party count
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;run&lt;/span&gt;() {
        phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndAwaitAdvance&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Now valid
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Register but never deregister
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;phaser.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Party count = 2
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;doWork();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Exit without deregistering
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Party count still 2. Other threads wait forever for this thread.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Deregister in finally
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;phaser.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    doWork();
    phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndAwaitAdvance&lt;/span&gt;();
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
    phaser.&lt;span style=&#34;color:#bbb&#34;&gt;arriveAndDeregister&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Decrement party count
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: onAdvance returns true too early
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Phaser phaser = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Phaser(1) {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onAdvance&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; phase, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; registeredParties) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Terminates immediately!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
};

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Return true only when done
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onAdvance&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; phase, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; registeredParties) {
    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Phase &amp;#34;&lt;/span&gt; + phase + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; complete&amp;#34;&lt;/span&gt;);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; phase &amp;gt;= 2 || registeredParties == 0; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Stop after phase 2
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Phaser vs CountDownLatch vs CyclicBarrier:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;CountDownLatch&lt;/th&gt;
&lt;th&gt;CyclicBarrier&lt;/th&gt;
&lt;th&gt;Phaser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reusable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic parties&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multiple phases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase tracking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-shot wait&lt;/td&gt;
&lt;td&gt;Fixed multi-phase&lt;/td&gt;
&lt;td&gt;Dynamic multi-phase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;debugging-concurrent-code&#34;&gt;Debugging Concurrent Code&lt;/h2&gt;
&lt;h3 id=&#34;reading-thread-dumps&#34;&gt;Reading Thread Dumps&lt;/h3&gt;
&lt;p&gt;Application hangs. No error logs. No exceptions. Take a thread dump—it shows every thread&amp;rsquo;s current state and stack trace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Get PID&lt;/span&gt;
jps

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Generate thread dump&lt;/span&gt;
jstack &amp;lt;PID&amp;gt; &amp;gt; thread_dump.txt

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Or send Ctrl+Break to console&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#24909d&#34;&gt;kill&lt;/span&gt; -3 &amp;lt;PID&amp;gt;  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Sends SIGQUIT, creates thread dump&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Example thread dump entry:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;payment-worker-1&amp;quot; #23 prio=5 os_prio=0 tid=0x00007f8a2c001000 nid=0x4d2 waiting on condition
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt
        at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
        at com.example.Service.process(Service.java:45)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;What this tells you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread state: WAITING means blocked on a synchronizer (CountDownLatch, Semaphore, Lock)&lt;/li&gt;
&lt;li&gt;Stack trace: Shows where thread is stuck (line 45 in Service.java)&lt;/li&gt;
&lt;li&gt;Lock info: Which object thread is waiting on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Red flags:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many threads WAITING on same object → Someone forgot countDown() or release()&lt;/li&gt;
&lt;li&gt;BLOCKED threads with circular dependencies → Deadlock&lt;/li&gt;
&lt;li&gt;Threads named &amp;ldquo;pool-1-thread-X&amp;rdquo; → No custom ThreadFactory (debugging nightmare)&lt;/li&gt;
&lt;li&gt;Thread in RUNNABLE for minutes → Infinite loop or expensive computation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;common-deadlock-patterns&#34;&gt;Common Deadlock Patterns&lt;/h3&gt;
&lt;h4 id=&#34;pattern-1-lock-ordering-deadlock&#34;&gt;Pattern 1: Lock Ordering Deadlock&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Why it deadlocks:&lt;/strong&gt;
Thread 1 holds lock A, needs lock B.
Thread 2 holds lock B, needs lock A.
Neither can proceed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// DEADLOCK
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Account&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Object lock = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Object();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;transfer&lt;/span&gt;(Account to, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;) {              &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1 locks A
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (to.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;) {             &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1 waits for B
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; -= amount;
                to.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; += amount;
            }
        }
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1: accountA.transfer(accountB, 100);  // Locks A, waits for B
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 2: accountB.transfer(accountA, 50);   // Locks B, waits for A
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Both threads wait forever.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// FIX: Always acquire locks in same order
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Use object hash code to determine order
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;transfer&lt;/span&gt;(Account to, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount) {
    Account first = System.&lt;span style=&#34;color:#bbb&#34;&gt;identityHashCode&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;) &amp;lt; System.&lt;span style=&#34;color:#bbb&#34;&gt;identityHashCode&lt;/span&gt;(to) 
                    ? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt; : to;
    Account second = first == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt; ? to : &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (first.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (second.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt; != first) {
                to.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; += amount;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; -= amount;
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; -= amount;
                to.&lt;span style=&#34;color:#bbb&#34;&gt;balance&lt;/span&gt; += amount;
            }
        }
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Now both threads acquire locks in same order. No circular wait.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;pattern-2-nested-lock-acquisition&#34;&gt;Pattern 2: Nested Lock Acquisition&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Why it deadlocks:&lt;/strong&gt;
method1() acquires lock1 → lock2
method2() acquires lock2 → lock1
Opposite order = deadlock&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// DEADLOCK
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Service&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Lock lock1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ReentrantLock();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Lock lock2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ReentrantLock();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;method1&lt;/span&gt;() {
        lock1.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            lock2.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Acquires lock2 while holding lock1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                doWork();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                lock2.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            lock1.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;method2&lt;/span&gt;() {
        lock2.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            lock1.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Opposite order!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                doWork();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                lock1.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            lock2.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
        }
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// FIX: Use tryLock with timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// If can&amp;#39;t acquire second lock, release first and retry
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;method2&lt;/span&gt;() {
    lock2.&lt;span style=&#34;color:#bbb&#34;&gt;lock&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (lock1.&lt;span style=&#34;color:#bbb&#34;&gt;tryLock&lt;/span&gt;(1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                doWork();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                lock1.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Failed to acquire lock1 - back off
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TimeoutException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Could not acquire lock&amp;#34;&lt;/span&gt;);
        }
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        lock2.&lt;span style=&#34;color:#bbb&#34;&gt;unlock&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;pattern-3-forgotten-countdownlatch&#34;&gt;Pattern 3: Forgotten CountDownLatch&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Why it hangs:&lt;/strong&gt;
Latch expects 3 countdowns. Task only counts down on success. If task fails, count stays at 3. &lt;code&gt;await()&lt;/code&gt; blocks forever.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// HANGS FOREVER
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(3);
pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    doWork();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (success) {  &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// BUG: Conditional countdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
    }
});

latch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Waits forever if doWork() fails
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// FIX: Always countDown, regardless of success
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Executes even if doWork() throws
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;detecting-deadlocks-programmatically&#34;&gt;Detecting Deadlocks Programmatically&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DeadlockDetector&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;detectDeadlocks&lt;/span&gt;() {
        ThreadMXBean threadBean = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadMXBean&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;[] deadlockedThreads = threadBean.&lt;span style=&#34;color:#bbb&#34;&gt;findDeadlockedThreads&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (deadlockedThreads != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            ThreadInfo[] threadInfos = threadBean.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadInfo&lt;/span&gt;(deadlockedThreads);
            
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;DEADLOCK DETECTED!&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (ThreadInfo info : threadInfos) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread: &amp;#34;&lt;/span&gt; + info.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadName&lt;/span&gt;());
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Locked on: &amp;#34;&lt;/span&gt; + info.&lt;span style=&#34;color:#bbb&#34;&gt;getLockName&lt;/span&gt;());
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Waiting for: &amp;#34;&lt;/span&gt; + info.&lt;span style=&#34;color:#bbb&#34;&gt;getLockOwnerName&lt;/span&gt;());
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Stack trace:&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (StackTraceElement element : info.&lt;span style=&#34;color:#bbb&#34;&gt;getStackTrace&lt;/span&gt;()) {
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;  &amp;#34;&lt;/span&gt; + element);
                }
            }
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Alert monitoring system
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            alertOps(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Deadlock detected!&amp;#34;&lt;/span&gt;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;monitoring-concurrent-systems&#34;&gt;Monitoring Concurrent Systems&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Why monitor:&lt;/strong&gt; Thread pools fail silently. Queue fills up. Threads deadlock. No exceptions thrown. Metrics reveal problems before users notice.&lt;/p&gt;
&lt;h3 id=&#34;key-metrics-to-track&#34;&gt;Key Metrics to Track&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConcurrencyMetrics&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MeterRegistry registry;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setupMetrics&lt;/span&gt;(ExecutorService pool, BlockingQueue&amp;lt;?&amp;gt; queue) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread pool metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (pool &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; ThreadPoolExecutor) {
            ThreadPoolExecutor tpe = (ThreadPoolExecutor) pool;
            
            registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threadpool.active&amp;#34;&lt;/span&gt;, tpe, ThreadPoolExecutor::getActiveCount);
            registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threadpool.size&amp;#34;&lt;/span&gt;, tpe, ThreadPoolExecutor::getPoolSize);
            registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threadpool.queue.size&amp;#34;&lt;/span&gt;, tpe, 
                e -&amp;gt; e.&lt;span style=&#34;color:#bbb&#34;&gt;getQueue&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Alert if queue is growing
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threadpool.queue.utilization&amp;#34;&lt;/span&gt;, tpe, e -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; queueSize = e.&lt;span style=&#34;color:#bbb&#34;&gt;getQueue&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; remainingCapacity = e.&lt;span style=&#34;color:#bbb&#34;&gt;getQueue&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;remainingCapacity&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt;) queueSize / (queueSize + remainingCapacity);
            });
        }
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Task execution metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        registry.&lt;span style=&#34;color:#bbb&#34;&gt;timer&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;task.execution.time&amp;#34;&lt;/span&gt;);
        registry.&lt;span style=&#34;color:#bbb&#34;&gt;counter&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;task.completed&amp;#34;&lt;/span&gt;);
        registry.&lt;span style=&#34;color:#bbb&#34;&gt;counter&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;task.failed&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Liveness check
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;system.deadlocked.threads&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;, 
            m -&amp;gt; countDeadlockedThreads());
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;countDeadlockedThreads&lt;/span&gt;() {
        ThreadMXBean threadBean = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadMXBean&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;[] deadlocked = threadBean.&lt;span style=&#34;color:#bbb&#34;&gt;findDeadlockedThreads&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; deadlocked != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ? deadlocked.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; : 0;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;critical-alerts&#34;&gt;Critical Alerts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Alert on:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Queue depth &amp;gt; 80% capacity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; Producers add tasks faster than consumers process them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Queue fills. New tasks rejected or block forever.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (queueUtilization &amp;gt; 0.&lt;span style=&#34;color:#bbb&#34;&gt;8&lt;/span&gt;) {
    alert(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Queue nearly full - scale consumers&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;All threads busy for &amp;gt; 1 minute&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; Every thread in pool is working. No idle threads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; New tasks queue up. Latency increases.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (activeThreads == poolSize &amp;amp;&amp;amp; duration &amp;gt; 60_000) {
    alert(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread pool saturated - increase size&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Task duration p99 &amp;gt; SLA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; 99th percentile task takes longer than expected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; User-facing timeouts. SLA violations.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (taskDurationP99 &amp;gt; slaMs) {
    alert(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task latency exceeds SLA&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deadlock detected&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; Threads waiting on each other in a cycle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Application hangs. Requires restart.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (deadlockedThreads &amp;gt; 0) {
    alert(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;CRITICAL: Deadlock - restart required&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thread count growing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; New threads created but never destroyed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Eventually hits OS thread limit. OutOfMemoryError.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (threadCountDelta &amp;gt; 10 &amp;amp;&amp;amp; timeWindow &amp;lt; 60_000) {
    alert(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread leak detected&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;common-anti-patterns-across-all-tools&#34;&gt;Common Anti-Patterns Across All Tools&lt;/h2&gt;
&lt;h3 id=&#34;1-thread-pool-sizing&#34;&gt;1. Thread Pool Sizing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ANTI-PATTERN: Magic numbers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(42);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Calculate based on workload
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; poolSize = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;() * 
               (isCpuBound ? 1 : 2);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// BETTER: Formula for I/O-bound
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ThreadCount = NumCores * (1 + WaitTime/ComputeTime)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; poolSize = cores * (1 + (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;)(waitTimeMs / computeTimeMs));
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-ignoring-shutdown&#34;&gt;2. Ignoring Shutdown&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Threads keep running after method returns. JVM doesn&amp;rsquo;t exit. Application hangs on shutdown.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: No shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; work());
} &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Threads still running. Pool never cleaned up.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Shutdown sequence
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; work()).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();                              &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Stop accepting new tasks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)) {
            pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdownNow&lt;/span&gt;();                       &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Force stop running tasks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-daemon-threads-for-critical-work&#34;&gt;3. Daemon Threads for Critical Work&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; JVM exits while daemon thread is mid-write. Database transaction incomplete. Data corrupted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Daemon threads die when JVM exits. Non-daemon threads keep JVM alive until they finish.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Daemon thread for DB writes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ThreadFactory factory = r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM exits → thread dies → DB write lost
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
};

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Non-daemon for critical work
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ThreadFactory factory = r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM waits for thread to finish
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
};
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;4-unbounded-queues&#34;&gt;4. Unbounded Queues&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Producer faster than consumer. Queue grows. Heap fills. OutOfMemoryError.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Unbounded queue
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;BlockingQueue&amp;lt;Task&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedBlockingQueue&amp;lt;&amp;gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// No limit!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Bounded queue
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;BlockingQueue&amp;lt;Task&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(1000);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// When full, put() blocks. Producer slows down. Backpressure applied.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;5-swallowing-exceptions&#34;&gt;5. Swallowing Exceptions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Task throws exception. &lt;code&gt;submit()&lt;/code&gt; catches it silently. No logs. No alerts. Silent failure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt; &lt;code&gt;submit()&lt;/code&gt; returns Future. Exception stored in Future. If you don&amp;rsquo;t call &lt;code&gt;get()&lt;/code&gt;, you never see it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// WRONG: Exception disappears
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    riskyOperation(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Throws exception → stored in Future → never retrieved
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Explicit error handling
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        riskyOperation();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task failed&amp;#34;&lt;/span&gt;, e);
        errorTracker.&lt;span style=&#34;color:#bbb&#34;&gt;captureException&lt;/span&gt;(e);
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;integration-example-complete-concurrent-pipeline&#34;&gt;Integration Example: Complete Concurrent Pipeline&lt;/h2&gt;
&lt;p&gt;Combining multiple tools to build a realistic image processing pipeline:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;81
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ProductionImagePipeline&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService downloadPool;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService processPool;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BlockingQueue&amp;lt;ImageTask&amp;gt; downloadQueue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BlockingQueue&amp;lt;ImageTask&amp;gt; processQueue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Semaphore rateLimiter;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MeterRegistry metrics;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ProductionImagePipeline&lt;/span&gt;(MeterRegistry metrics) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;metrics&lt;/span&gt; = metrics;
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Custom thread factories for debugging
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;downloadPool&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10,
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;image-downloader&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;));
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;processPool&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(4,
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;image-processor&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;));
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Bounded queues for backpressure
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;downloadQueue&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(100);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;processQueue&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(50);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Rate limiter: 10 downloads per second
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;rateLimiter&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Semaphore(10, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Setup monitoring
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        setupMetrics();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CompletableFuture&amp;lt;ProcessedImage&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;(String imageUrl) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture
            .&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; downloadWithRetry(imageUrl), downloadPool)
            .&lt;span style=&#34;color:#bbb&#34;&gt;thenApplyAsync&lt;/span&gt;(image -&amp;gt; processImage(image), processPool)
            .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(ex -&amp;gt; {
                metrics.&lt;span style=&#34;color:#bbb&#34;&gt;counter&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;pipeline.failed&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;increment&lt;/span&gt;();
                logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Pipeline failed for &amp;#34;&lt;/span&gt; + imageUrl, ex);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
            });
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; RawImage &lt;span style=&#34;color:#447fcf&#34;&gt;downloadWithRetry&lt;/span&gt;(String url) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// DelayQueue pattern for retry
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; attempt = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (attempt &amp;lt; 3) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Rate limiting with semaphore
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                rateLimiter.&lt;span style=&#34;color:#bbb&#34;&gt;acquire&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; download(url);
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                    rateLimiter.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;();
                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
                attempt++;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (attempt &amp;gt;= 3) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; e;
                
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; backoff = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;) Math.&lt;span style=&#34;color:#bbb&#34;&gt;pow&lt;/span&gt;(2, attempt) * 1000;
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(backoff);
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Max retries exceeded&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setupMetrics&lt;/span&gt;() {
        metrics.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;queue.download.size&amp;#34;&lt;/span&gt;, downloadQueue, BlockingQueue::size);
        metrics.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;queue.process.size&amp;#34;&lt;/span&gt;, processQueue, BlockingQueue::size);
        metrics.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ratelimiter.available&amp;#34;&lt;/span&gt;, rateLimiter, 
            Semaphore::availablePermits);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        downloadPool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        processPool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            downloadPool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
            processPool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            downloadPool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdownNow&lt;/span&gt;();
            processPool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdownNow&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;production-readiness-checklist&#34;&gt;Production Readiness Checklist&lt;/h2&gt;
&lt;p&gt;Before deploying concurrent code:&lt;/p&gt;
&lt;h3 id=&#34;resource-management&#34;&gt;Resource Management&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; All thread pools have bounded queues&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Shutdown handlers registered&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Timeouts on all blocking operations&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Thread pool sizes calculated, not guessed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;observability&#34;&gt;Observability&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Thread pools have meaningful names (ThreadFactory)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Queue depths monitored&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Task execution times tracked&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Deadlock detection enabled&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Exception handlers log to monitoring system&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;error-handling&#34;&gt;Error Handling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; All Future.get() calls have timeouts&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Async task exceptions logged&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Circuit breakers on external calls&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Retry logic with exponential backoff&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;testing&#34;&gt;Testing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Load tests with concurrent users&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Chaos engineering (kill threads mid-execution)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Thread dump analysis under load&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Memory profiling for leaks&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;complete-toolkit-summary-all-3-parts&#34;&gt;Complete Toolkit Summary (All 3 Parts)&lt;/h2&gt;
&lt;h3 id=&#34;execution-tools-part-1---day-95&#34;&gt;Execution Tools (Part 1 - Day 95)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Executor&lt;/strong&gt; → Submit and forget tasks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ExecutorService&lt;/strong&gt; → Managed thread pools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ScheduledExecutorService&lt;/strong&gt; → Periodic execution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future&lt;/strong&gt; → Blocking result retrieval&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CompletableFuture&lt;/strong&gt; → Non-blocking async pipelines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CountDownLatch&lt;/strong&gt; → One-shot coordination&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;synchronization-tools-part-2---day-96&#34;&gt;Synchronization Tools (Part 2 - Day 96)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CyclicBarrier&lt;/strong&gt; → Multi-phase checkpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semaphore&lt;/strong&gt; → Resource limiting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThreadFactory&lt;/strong&gt; → Thread customization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BlockingQueue&lt;/strong&gt; → Producer-consumer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;advanced-tools-part-3---today&#34;&gt;Advanced Tools (Part 3 - Today)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DelayQueue&lt;/strong&gt; → Delayed execution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ReentrantLock&lt;/strong&gt; → Custom locking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phaser&lt;/strong&gt; → Dynamic multi-phase&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;choosing-the-right-tool-decision-tree&#34;&gt;Choosing the Right Tool: Decision Tree&lt;/h2&gt;
&lt;p&gt;From my understanding we can have draw this decision tree as our mental model where we can have some idea to choose which tool will go with whic types of task the best.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1764909602/Untitled-2025-12-04-2228_gwudj1.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h2 id=&#34;key-principles-ive-learned&#34;&gt;Key Principles I&amp;rsquo;ve Learned&lt;/h2&gt;
&lt;h3 id=&#34;1-always-set-timeouts&#34;&gt;1. Always Set Timeouts&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Future.get()&lt;/code&gt; without timeout blocks forever if task hangs. &lt;code&gt;Lock.lock()&lt;/code&gt; without timeout deadlocks permanently. Always use timeout variants: &lt;code&gt;get(timeout)&lt;/code&gt;, &lt;code&gt;tryLock(timeout)&lt;/code&gt;, &lt;code&gt;acquire(timeout)&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;2-name-your-threads&#34;&gt;2. Name Your Threads&lt;/h3&gt;
&lt;p&gt;Thread dump shows &amp;ldquo;pool-1-thread-17&amp;rdquo;. Which service? Which operation? Unknown. Custom &lt;code&gt;ThreadFactory&lt;/code&gt; adds meaningful names: &amp;ldquo;payment-processor-3&amp;rdquo;. Debugging becomes possible.&lt;/p&gt;
&lt;h3 id=&#34;3-monitor-queue-depths&#34;&gt;3. Monitor Queue Depths&lt;/h3&gt;
&lt;p&gt;Queue at 10% → normal. Queue at 90% → consumers falling behind. Queue at 100% → producers blocking. Monitor queue depth. Alert before it fills.&lt;/p&gt;
&lt;h3 id=&#34;4-graceful-shutdown-is-hard&#34;&gt;4. Graceful Shutdown is Hard&lt;/h3&gt;
&lt;p&gt;Three steps: &lt;code&gt;shutdown()&lt;/code&gt; stops accepting new tasks. &lt;code&gt;awaitTermination(timeout)&lt;/code&gt; waits for running tasks. &lt;code&gt;shutdownNow()&lt;/code&gt; interrupts if timeout exceeded. Miss any step → threads leak or work lost.&lt;/p&gt;
&lt;h3 id=&#34;5-beware-of-daemon-threads&#34;&gt;5. Beware of Daemon Threads&lt;/h3&gt;
&lt;p&gt;Daemon thread flushing logs. JVM exits. Thread dies mid-write. Logs lost. Use daemon threads only for non-critical background work.&lt;/p&gt;
&lt;h3 id=&#34;6-fair-vs-unfair-locks-matter&#34;&gt;6. Fair vs Unfair Locks Matter&lt;/h3&gt;
&lt;p&gt;Fair lock: threads acquire in request order. Prevents starvation. Lower throughput.
Unfair lock: any thread can acquire. Higher throughput. Starvation possible.
Default is unfair. Choose explicitly.&lt;/p&gt;
&lt;h3 id=&#34;7-bounded-resources-prevent-cascading-failures&#34;&gt;7. Bounded Resources Prevent Cascading Failures&lt;/h3&gt;
&lt;p&gt;Unbounded queue fills memory. OOM kills application. Bounded queue applies backpressure. Producer slows down. System stays alive.&lt;/p&gt;
&lt;h3 id=&#34;8-composition-over-complexity&#34;&gt;8. Composition Over Complexity&lt;/h3&gt;
&lt;p&gt;Need one-shot coordination? CountDownLatch. Need reusable barrier? CyclicBarrier. Need dynamic parties? Then Phaser. Start simple. Add complexity only when required.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;when-not-to-use-these-tools&#34;&gt;When NOT to Use These Tools&lt;/h2&gt;
&lt;p&gt;Before reaching for concurrency, ask:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t use if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sequential processing takes &amp;lt; 100ms&lt;/li&gt;
&lt;li&gt;Task is sequential (B depends on A)&lt;/li&gt;
&lt;li&gt;Dataset is small (&amp;lt; 1000 items)&lt;/li&gt;
&lt;li&gt;Debugging complexity outweighs performance gain&lt;/li&gt;
&lt;li&gt;Team lacks concurrency expertise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Do use if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I/O-bound operations (network, disk, DB)&lt;/li&gt;
&lt;li&gt;Independent tasks that parallelize&lt;/li&gt;
&lt;li&gt;Need to keep UI/API responsive&lt;/li&gt;
&lt;li&gt;Processing large datasets&lt;/li&gt;
&lt;li&gt;Proven bottleneck exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Measure first. Prove the bottleneck. Then add concurrency. Concurrency adds complexity. Complexity adds bugs. Only pay that cost when the benefit is real.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;understanding-the-complete-toolkit&#34;&gt;Understanding the Complete Toolkit&lt;/h2&gt;
&lt;p&gt;Over these three parts, we&amp;rsquo;ve explored &lt;strong&gt;13 essential concurrency tools&lt;/strong&gt;. I&amp;rsquo;ve used some extensively in production (ExecutorService, Future, CountDownLatch, ReentrantLock), while others (Phaser, DelayQueue) I&amp;rsquo;m still mastering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The insight:&lt;/strong&gt; Concurrency isn&amp;rsquo;t about speed. It&amp;rsquo;s about &lt;strong&gt;structure&lt;/strong&gt;. How do you coordinate independent work? How do you prevent threads from corrupting shared state? How do you fail gracefully under load?&lt;/p&gt;
&lt;p&gt;Each tool solves a specific problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execute? → ExecutorService&lt;/li&gt;
&lt;li&gt;Wait? → CountDownLatch / CyclicBarrier / Phaser&lt;/li&gt;
&lt;li&gt;Limit? → Semaphore&lt;/li&gt;
&lt;li&gt;Pass work? → BlockingQueue&lt;/li&gt;
&lt;li&gt;Delay? → DelayQueue / ScheduledExecutorService&lt;/li&gt;
&lt;li&gt;Custom locking? → ReentrantLock&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The skill is &lt;strong&gt;knowing which tool fits your use case&lt;/strong&gt;. That&amp;rsquo;s what these 13 tools teach.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s Next?&lt;/h2&gt;
&lt;p&gt;This completes our deep dive into &lt;code&gt;java.util.concurrent&lt;/code&gt;. More to learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Threads (Java 19+)&lt;/strong&gt; - Lightweight threads that change the concurrency model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reactive Streams&lt;/strong&gt; - Async streams with backpressure (Project Reactor, RxJava)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fork/Join Framework&lt;/strong&gt; - Recursive parallelism for divide-and-conquer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel Streams&lt;/strong&gt; - When and when not to use them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured Concurrency (Preview)&lt;/strong&gt; - Better async task management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next time you&amp;rsquo;re tempted to spawn a raw &lt;code&gt;Thread&lt;/code&gt;, ask yourself: &lt;strong&gt;which of these 13 patterns fits my use case?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the question I&amp;rsquo;m learning to answer.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day96&#34;&gt;Day 96 - Java Concurrency Toolkit Part 2: Core Synchronization Patterns&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 96: Java Concurrency Toolkit Part 2 - Core Synchronization Patterns</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day96/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day96/</id>
    <published>2025-12-10T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Part 2: Core Synchronization Patterns - Deep dive into 4 essential coordination tools with real-world patterns, performance characteristics, and common pitfalls</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series Navigation:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day95&#34;&gt;Part 1: Foundation &amp;amp; Execution&lt;/a&gt; • &lt;a href=&#34;#&#34;&gt;Part 2 (You are here)&lt;/a&gt; • &lt;a href=&#34;/posts/java/100DaysOfJava/day97&#34;&gt;Part 3: Advanced Patterns&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;The art of concurrent programming lies not in making things parallel, but in coordinating parallel things gracefully.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;/posts/java/100DaysOfJava/day95&#34;&gt;Part 1 (Day 95)&lt;/a&gt;, we covered &lt;strong&gt;foundation and execution patterns&lt;/strong&gt;: Executor, ExecutorService, ScheduledExecutorService, Future, CompletableFuture, and CountDownLatch. These tools execute tasks concurrently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt; covers &lt;strong&gt;core synchronization patterns&lt;/strong&gt;—the tools that coordinate threads and protect shared resources.&lt;/p&gt;
&lt;h2 id=&#34;series-overview&#34;&gt;Series Overview&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;3-part series&lt;/strong&gt; on Java Concurrency:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1 (Day 95):&lt;/strong&gt; Foundation &amp;amp; Execution&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Executor, ExecutorService, ScheduledExecutorService&lt;/li&gt;
&lt;li&gt;Future, CompletableFuture, CountDownLatch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 2 (Today - Day 96):&lt;/strong&gt; Core Synchronization Patterns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CyclicBarrier, Semaphore, ThreadFactory, BlockingQueue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 3 (Day 97):&lt;/strong&gt; Advanced Patterns &amp;amp; Production Readiness&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DelayQueue, ReentrantLock, Phaser&lt;/li&gt;
&lt;li&gt;Debugging, Monitoring, Production Patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-were-covering-today&#34;&gt;What We&amp;rsquo;re Covering Today&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Part 2 (Today):&lt;/strong&gt; Core Synchronization Patterns&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CyclicBarrier - Reusable multi-phase synchronization&lt;/li&gt;
&lt;li&gt;Semaphore - Resource pool management&lt;/li&gt;
&lt;li&gt;ThreadFactory - Production-ready thread management&lt;/li&gt;
&lt;li&gt;BlockingQueue - Producer-consumer patterns&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;quick-reference-part-2-tools-at-a-glance&#34;&gt;Quick Reference: Part 2 Tools at a Glance&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;TL;DR&lt;/th&gt;
&lt;th&gt;Caveat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CyclicBarrier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reusable synchronization checkpoint for fixed threads. All must arrive before any proceed.&lt;/td&gt;
&lt;td&gt;Fixed party count. If one thread fails, all block forever&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semaphore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controls concurrent access to limited resources. Think &amp;ldquo;permission slips&amp;rdquo; (N max).&lt;/td&gt;
&lt;td&gt;Must release in &lt;code&gt;finally&lt;/code&gt; - easy to leak permits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ThreadFactory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Customizes thread creation. Name your threads for debugging!&lt;/td&gt;
&lt;td&gt;Daemon threads die when JVM exits - bad for critical work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BlockingQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decouples producers/consumers with thread-safe queue. Built-in backpressure.&lt;/td&gt;
&lt;td&gt;Unbounded queues = OOM. Use bounded &lt;code&gt;ArrayBlockingQueue&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-coordination-challenge&#34;&gt;The Coordination Challenge&lt;/h2&gt;
&lt;p&gt;Part 1 showed how to execute work concurrently. But execution alone isn&amp;rsquo;t enough. Real systems need &lt;strong&gt;coordination&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1764909602/Untitled-2025-12-04-2228_gwudj1.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Think of it like a construction project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workers need to sync at checkpoints (CyclicBarrier)&lt;/li&gt;
&lt;li&gt;Only X workers can use the crane at once (Semaphore)&lt;/li&gt;
&lt;li&gt;Workers need proper uniforms and tools (ThreadFactory)&lt;/li&gt;
&lt;li&gt;Materials move between stations (BlockingQueue)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-cyclicbarrier-multi-phase-processing&#34;&gt;1. CyclicBarrier: Multi-Phase Processing&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You&amp;rsquo;re processing a large dataset in three phases: Extract → Transform → Load. Each phase must finish across all threads before the next begins.&lt;/p&gt;
&lt;p&gt;Use CyclicBarrier for batch processing with distinct phases. Unlike CountDownLatch (one-shot), CyclicBarrier resets after each phase. This makes iterative processing simple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Synchronized phase transitions with CyclicBarrier.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.IntStream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BatchProcessor&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; workerCount;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;BatchProcessor&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; workerCount) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;workerCount&lt;/span&gt; = workerCount;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processBatch&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        CyclicBarrier barrier = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CyclicBarrier(
            workerCount,
            () -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--- Phase completed. All workers synchronized ---&amp;#34;&lt;/span&gt;)
        );
        
        ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(workerCount);
        
        Runnable worker = () -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                String threadName = Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;();
                
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Phase 1: Extract
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Extracting data...&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Extract complete&amp;#34;&lt;/span&gt;);
                
                barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all threads to finish Phase 1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Phase 2: Transform
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Transforming data...&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Transform complete&amp;#34;&lt;/span&gt;);
                
                barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all threads to finish Phase 2
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Phase 3: Load
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Loading data...&amp;#34;&lt;/span&gt;);
                Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 1500));
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(threadName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Load complete&amp;#34;&lt;/span&gt;);
                
                barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all threads to finish Phase 3
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException | BrokenBarrierException e) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Worker interrupted: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            }
        };
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Submit all workers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0, workerCount)
                .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(i -&amp;gt; pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(worker));
        
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MINUTES&lt;/span&gt;);
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Batch processing complete!&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Key Difference from CountDownLatch:&lt;/strong&gt; CyclicBarrier is reusable. After all threads reach the barrier, it resets automatically. Use it for iterative or phase-based processing.&lt;/p&gt;
&lt;h3 id=&#34;visualizing-cyclicbarrier&#34;&gt;Visualizing CyclicBarrier&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a sequence diagram showing how &lt;code&gt;CyclicBarrier&lt;/code&gt; works:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1764909831/Untitled-2025-12-05-1042_snaqyv.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;trade-offs-and-limitations&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reusable (unlike CountDownLatch)&lt;/li&gt;
&lt;li&gt;Built-in barrier action (callback when all arrive)&lt;/li&gt;
&lt;li&gt;Low overhead&lt;/li&gt;
&lt;li&gt;Thread-safe reset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed number of parties (must be known at creation)&lt;/li&gt;
&lt;li&gt;If one thread fails, others wait forever (unless you handle BrokenBarrierException)&lt;/li&gt;
&lt;li&gt;No dynamic party registration (use Phaser instead)&lt;/li&gt;
&lt;li&gt;All threads must reach barrier together (can&amp;rsquo;t have stragglers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 1: Wrong party count
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CyclicBarrier barrier = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CyclicBarrier(5);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Only 3 threads!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        doWork();
        barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks forever! Only 3/5 arrived
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    });
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Match party count
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; parties = 3;
CyclicBarrier barrier = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CyclicBarrier(parties);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; parties; i++) {
    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        doWork();
        barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
    });
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Not handling BrokenBarrierException
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    doWork();
    barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// What if another thread throws exception?
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Handle broken barrier
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
        barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (BrokenBarrierException e) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Barrier broken! Aborting.&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Cleanup and exit
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
    }
});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: Reusing after reset without checking
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (barrier.&lt;span style=&#34;color:#bbb&#34;&gt;isBroken&lt;/span&gt;()) {
    barrier.&lt;span style=&#34;color:#bbb&#34;&gt;reset&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Must reset explicitly if broken
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Check state before reuse
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (barrier.&lt;span style=&#34;color:#bbb&#34;&gt;isBroken&lt;/span&gt;()) {
    barrier.&lt;span style=&#34;color:#bbb&#34;&gt;reset&lt;/span&gt;();
}
barrier.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed number of worker threads&lt;/li&gt;
&lt;li&gt;Multi-phase processing where all must complete each phase&lt;/li&gt;
&lt;li&gt;Iterative algorithms (simulations, game loops)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t use when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need dynamic party count (use Phaser)&lt;/li&gt;
&lt;li&gt;You need one-shot synchronization (use CountDownLatch)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-semaphore-resource-pool-management&#34;&gt;2. Semaphore: Resource Pool Management&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Your database connection pool has 10 connections. If 50 threads query simultaneously, you overwhelm the pool and get timeouts.&lt;/p&gt;
&lt;p&gt;Semaphore limits concurrent access to finite resources. Acquire a permit before using the resource, release it when done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Limit concurrent access with Semaphore.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DatabaseService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Semaphore connectionPermits;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxConnections;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;DatabaseService&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxConnections) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;maxConnections&lt;/span&gt; = maxConnections;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;connectionPermits&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Semaphore(maxConnections, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// fair=true for FIFO
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;executeQuery&lt;/span&gt;(String sql) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Requesting DB connection...&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Try to acquire permit (blocks if none available)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            connectionPermits.&lt;span style=&#34;color:#bbb&#34;&gt;acquire&lt;/span&gt;();
            
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Got connection! &amp;#34;&lt;/span&gt; +
                             &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Available: &amp;#34;&lt;/span&gt; + connectionPermits.&lt;span style=&#34;color:#bbb&#34;&gt;availablePermits&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; + maxConnections);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Execute query
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            String result = runActualQuery(sql);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Query interrupted&amp;#34;&lt;/span&gt;;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Always release permit
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            connectionPermits.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Released connection&amp;#34;&lt;/span&gt;);
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryExecuteQueryWithTimeout&lt;/span&gt;(String sql, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; timeoutMs) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Try to acquire with timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (connectionPermits.&lt;span style=&#34;color:#bbb&#34;&gt;tryAcquire&lt;/span&gt;(timeoutMs, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;)) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    runActualQuery(sql);
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                    connectionPermits.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;();
                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Could not acquire connection within &amp;#34;&lt;/span&gt; + timeoutMs + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;runActualQuery&lt;/span&gt;(String sql) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate DB query
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(1000);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Result for: &amp;#34;&lt;/span&gt; + sql;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Use &lt;code&gt;tryAcquire()&lt;/code&gt; with timeout in request handlers to fail fast instead of blocking indefinitely. Your users will thank you.&lt;/p&gt;
&lt;h3 id=&#34;trade-offs-and-limitations-1&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple API (acquire/release)&lt;/li&gt;
&lt;li&gt;Supports fair vs non-fair modes&lt;/li&gt;
&lt;li&gt;Can try with timeout&lt;/li&gt;
&lt;li&gt;Can query available permits&lt;/li&gt;
&lt;li&gt;Very low overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No automatic resource management (must call release in finally)&lt;/li&gt;
&lt;li&gt;Permits can be released by any thread (not tied to acquirer)&lt;/li&gt;
&lt;li&gt;No built-in timeout enforcement on resource usage&lt;/li&gt;
&lt;li&gt;Can accidentally create permit leaks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 1: Forgetting to release
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;acquire&lt;/span&gt;();
doWork(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// What if this throws?
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Never called!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Always use try-finally
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;acquire&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    doWork();
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
    semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Always happens
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Releasing without acquiring
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Increases permit count above initial!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This creates &amp;#34;phantom permits&amp;#34; that break your resource limit
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Only release what you acquired
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; acquired = semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;tryAcquire&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (acquired) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        semaphore.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;();
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: Using unfair mode for critical resources
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Semaphore semaphore = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Semaphore(1, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// unfair
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Threads can &amp;#34;cut in line&amp;#34; causing starvation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Use fair mode for critical resources
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Semaphore semaphore = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Semaphore(1, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// fair = FIFO
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;what-is-fairunfair-in-a-semaphore&#34;&gt;What is Fair/Unfair in a Semaphore&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve mentioned fair/unfair mode in the code above. Here&amp;rsquo;s what they mean:&lt;/p&gt;
&lt;p&gt;Semaphore operates in either fair or unfair mode. This determines the order waiting threads acquire permits. You trade guaranteed access for throughput.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fair Mode:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Threads acquire permits in request order (FIFO queue)&lt;/li&gt;
&lt;li&gt;The longest-waiting thread gets the next available permit&lt;/li&gt;
&lt;li&gt;Prevents starvation—no thread waits forever while new threads keep acquiring permits&lt;/li&gt;
&lt;li&gt;Use for critical resources like database connection pools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Unfair Mode:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better performance—no FIFO queue overhead means fewer context switches&lt;/li&gt;
&lt;li&gt;Higher throughput but some threads might starve&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To create a fair semaphore, you use the constructor &lt;code&gt;new Semaphore(int permits, true)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-World Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Database connection pools&lt;/li&gt;
&lt;li&gt;API rate limiting (X requests per second)&lt;/li&gt;
&lt;li&gt;Limited worker threads for CPU-intensive tasks&lt;/li&gt;
&lt;li&gt;Bounded parallelism in file I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;integration-example-rate-limiting&#34;&gt;Integration Example: Rate Limiting&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;RateLimiter&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Semaphore permits;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ScheduledExecutorService refiller;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;RateLimiter&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; permitsPerSecond) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;permits&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Semaphore(permitsPerSecond, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;refiller&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newScheduledThreadPool&lt;/span&gt;(1);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Refill permits every second
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        refiller.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; available = permits.&lt;span style=&#34;color:#bbb&#34;&gt;availablePermits&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; toAdd = permitsPerSecond - available;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (toAdd &amp;gt; 0) {
                permits.&lt;span style=&#34;color:#bbb&#34;&gt;release&lt;/span&gt;(toAdd);
            }
        }, 1, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAcquire&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; permits.&lt;span style=&#34;color:#bbb&#34;&gt;tryAcquire&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-threadfactory-production-ready-thread-management&#34;&gt;3. ThreadFactory: Production-Ready Thread Management&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Your thread dump shows dozens of threads named &lt;code&gt;pool-1-thread-X&lt;/code&gt;. You can&amp;rsquo;t debug which pool causes the issue.&lt;/p&gt;
&lt;p&gt;Custom ThreadFactory gives you control over thread creation. Name threads for easier debugging and monitoring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Custom ThreadFactory with meaningful names and proper configuration.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.atomic.AtomicInteger&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;NamedThreadFactory&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; ThreadFactory {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String namePrefix;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger threadNumber;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; daemon;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; priority;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;NamedThreadFactory&lt;/span&gt;(String namePrefix, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; daemon, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; priority) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;namePrefix&lt;/span&gt; = namePrefix;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;daemon&lt;/span&gt; = daemon;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;priority&lt;/span&gt; = priority;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;threadNumber&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(1);
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Thread &lt;span style=&#34;color:#447fcf&#34;&gt;newThread&lt;/span&gt;(Runnable r) {
        Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(namePrefix + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + threadNumber.&lt;span style=&#34;color:#bbb&#34;&gt;getAndIncrement&lt;/span&gt;());
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(daemon);
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setPriority&lt;/span&gt;(priority);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Add uncaught exception handler
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        t.&lt;span style=&#34;color:#bbb&#34;&gt;setUncaughtExceptionHandler&lt;/span&gt;((thread, throwable) -&amp;gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Uncaught exception in &amp;#34;&lt;/span&gt; + thread.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + 
                             throwable.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In production: send to error tracking service like sentry, rollbar etc
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        });
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; ExecutorService &lt;span style=&#34;color:#447fcf&#34;&gt;createNamedPool&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; size) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(
            size,
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;)
        );
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Usage example
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ServiceOrchestrator&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService paymentPool;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService notificationPool;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService analyticsPool;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ServiceOrchestrator&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;paymentPool&lt;/span&gt; = NamedThreadFactory.&lt;span style=&#34;color:#bbb&#34;&gt;createNamedPool&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;payment-worker&amp;#34;&lt;/span&gt;, 8);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;notificationPool&lt;/span&gt; = NamedThreadFactory.&lt;span style=&#34;color:#bbb&#34;&gt;createNamedPool&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;notification-worker&amp;#34;&lt;/span&gt;, 4);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;analyticsPool&lt;/span&gt; = NamedThreadFactory.&lt;span style=&#34;color:#bbb&#34;&gt;createNamedPool&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;analytics-worker&amp;#34;&lt;/span&gt;, 2);
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Now thread dumps show: payment-worker-1, notification-worker-1, analytics-worker-1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Instead of: pool-1-thread-1, pool-2-thread-1, pool-3-thread-1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Production Checklist:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Meaningful thread names&lt;/li&gt;
&lt;li&gt;Daemon status set correctly&lt;/li&gt;
&lt;li&gt;Uncaught exception handlers&lt;/li&gt;
&lt;li&gt;Appropriate priority levels&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;trade-offs-and-limitations-2&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full control over thread properties&lt;/li&gt;
&lt;li&gt;Consistent naming for debugging&lt;/li&gt;
&lt;li&gt;Centralized exception handling&lt;/li&gt;
&lt;li&gt;Can add custom initialization logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More boilerplate than default factories&lt;/li&gt;
&lt;li&gt;Easy to forget to use it&lt;/li&gt;
&lt;li&gt;Doesn&amp;rsquo;t prevent thread leaks (just makes them easier to find)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 1: Using daemon threads for critical work
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ThreadFactory factory = r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM can exit while thread is running!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
};
ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10, factory);
pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    writeToDatabase(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// May not complete before JVM exits!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Non-daemon for critical work
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ThreadFactory factory = r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM waits for completion
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
};

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Not thread-safe counter
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BadFactory&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; ThreadFactory {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; counter = 0; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Not thread-safe!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Thread &lt;span style=&#34;color:#447fcf&#34;&gt;newThread&lt;/span&gt;(Runnable r) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;worker-&amp;#34;&lt;/span&gt; + counter++);
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Use AtomicInteger
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;GoodFactory&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; ThreadFactory {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger counter = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(0);
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Thread &lt;span style=&#34;color:#447fcf&#34;&gt;newThread&lt;/span&gt;(Runnable r) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;worker-&amp;#34;&lt;/span&gt; + counter.&lt;span style=&#34;color:#bbb&#34;&gt;getAndIncrement&lt;/span&gt;());
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: Swallowing exceptions in handler
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;t.&lt;span style=&#34;color:#bbb&#34;&gt;setUncaughtExceptionHandler&lt;/span&gt;((thread, throwable) -&amp;gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Just print? Exception is lost!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    throwable.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Send to monitoring system
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;t.&lt;span style=&#34;color:#bbb&#34;&gt;setUncaughtExceptionHandler&lt;/span&gt;((thread, throwable) -&amp;gt; {
    logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Uncaught exception in &amp;#34;&lt;/span&gt; + thread.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), throwable);
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Send to Sentry, Rollbar, etc.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    errorTracker.&lt;span style=&#34;color:#bbb&#34;&gt;captureException&lt;/span&gt;(throwable);
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Update metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    exceptionCounter.&lt;span style=&#34;color:#bbb&#34;&gt;increment&lt;/span&gt;();
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;monitoring-integration&#34;&gt;Monitoring Integration&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MonitoredThreadFactory&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; ThreadFactory {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String namePrefix;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger threadNumber = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(1);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger createdThreads;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicInteger activeThreads;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;MonitoredThreadFactory&lt;/span&gt;(String namePrefix, MeterRegistry registry) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;namePrefix&lt;/span&gt; = namePrefix;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;createdThreads&lt;/span&gt; = registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threads.created&amp;#34;&lt;/span&gt;, 
            Tags.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;pool&amp;#34;&lt;/span&gt;, namePrefix), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(0));
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;activeThreads&lt;/span&gt; = registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;threads.active&amp;#34;&lt;/span&gt;, 
            Tags.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;pool&amp;#34;&lt;/span&gt;, namePrefix), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicInteger(0));
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Thread &lt;span style=&#34;color:#447fcf&#34;&gt;newThread&lt;/span&gt;(Runnable r) {
        createdThreads.&lt;span style=&#34;color:#bbb&#34;&gt;incrementAndGet&lt;/span&gt;();
        activeThreads.&lt;span style=&#34;color:#bbb&#34;&gt;incrementAndGet&lt;/span&gt;();
        
        Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                r.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
                activeThreads.&lt;span style=&#34;color:#bbb&#34;&gt;decrementAndGet&lt;/span&gt;();
            }
        });
        
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(namePrefix + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + threadNumber.&lt;span style=&#34;color:#bbb&#34;&gt;getAndIncrement&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-blockingqueue-the-producer-consumer-pattern&#34;&gt;4. BlockingQueue: The Producer-Consumer Pattern&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Your service receives 1000 requests/second but processes only 100/second. Without buffering, you drop requests or crash.&lt;/p&gt;
&lt;p&gt;BlockingQueue decouples work submission from execution. It provides natural backpressure when consumers can&amp;rsquo;t keep up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Decouple producers from consumers with a bounded queue.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;88
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ImageProcessingPipeline&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BlockingQueue&amp;lt;Path&amp;gt; imageQueue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService producers;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService consumers;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; running;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ImageProcessingPipeline&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; queueSize, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; consumerCount) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;imageQueue&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(queueSize);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;producers&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadExecutor&lt;/span&gt;(
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;image-producer&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;)
        );
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;consumers&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(
            consumerCount,
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NamedThreadFactory(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;image-consumer&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;NORM_PRIORITY&lt;/span&gt;)
        );
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;running&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;start&lt;/span&gt;(Path imageDirectory) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Starting image processing pipeline...&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Producer: Read image files and add to queue
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        producers.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; paths = Files.&lt;span style=&#34;color:#bbb&#34;&gt;list&lt;/span&gt;(imageDirectory)) {
                paths.&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(p -&amp;gt; p.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.jpg&amp;#34;&lt;/span&gt;))
                     .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(path -&amp;gt; {
                         &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                             System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Producer: Queuing &amp;#34;&lt;/span&gt; + path.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;());
                             imageQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(path); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks if queue is full
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                         } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
                             Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
                         }
                     });
                     
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Signal completion by adding poison pills
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;(); i++) {
                    imageQueue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;STOP&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Sentinel value
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Producer error: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            }
        });
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Consumers: Process images from queue
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; consumerCount = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; consumerCount; i++) {
            consumers.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (running) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                        Path image = imageQueue.&lt;span style=&#34;color:#bbb&#34;&gt;take&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks if queue is empty
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (image.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;STOP&amp;#34;&lt;/span&gt;)) {
                            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Consumer received stop signal&amp;#34;&lt;/span&gt;);
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                        }
                        
                        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Consumer: Processing &amp;#34;&lt;/span&gt; + image.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;());
                        compressImage(image);
                        
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
                        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                    }
                }
            });
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compressImage&lt;/span&gt;(Path image) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate compression work
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(500);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Compressed: &amp;#34;&lt;/span&gt; + image.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        running = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        producers.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        consumers.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Key Pattern:&lt;/strong&gt; Use the &amp;ldquo;poison pill&amp;rdquo; technique—a sentinel value (&lt;code&gt;STOP&lt;/code&gt; in this example) that signals consumers to stop gracefully.&lt;/p&gt;
&lt;h3 id=&#34;trade-offs-and-limitations-3&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Built-in backpressure (blocks when full)&lt;/li&gt;
&lt;li&gt;Thread-safe operations&lt;/li&gt;
&lt;li&gt;Natural decoupling of producers/consumers&lt;/li&gt;
&lt;li&gt;Multiple queue implementations (Array, Linked, Priority, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bounded queues block producers when full&lt;/li&gt;
&lt;li&gt;Unbounded queues cause OOM&lt;/li&gt;
&lt;li&gt;No built-in monitoring for queue depth&lt;/li&gt;
&lt;li&gt;Poison pill pattern needs careful coordination&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Queue Implementation Trade-offs:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Ordering&lt;/th&gt;
&lt;th&gt;Bounded&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ArrayBlockingQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FIFO&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Fixed capacity, predictable memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LinkedBlockingQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FIFO&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Variable load, unbounded acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PriorityBlockingQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Task prioritization needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SynchronousQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Direct handoff (zero capacity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DelayQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delay time&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Delayed execution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 1: Unbounded queue with slow consumers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;BlockingQueue&amp;lt;Task&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedBlockingQueue&amp;lt;&amp;gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Unbounded!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Producer adds 1000 items/sec, consumer processes 10/sec
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Queue grows to millions = OOM!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Bounded queue with backpressure
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;BlockingQueue&amp;lt;Task&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(1000);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Producer blocks when queue is full = natural backpressure
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Not handling interruption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;queue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(task); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks if full, but what if interrupted?
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Handle interruption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    queue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(task);
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Cleanup and exit gracefully
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: Poison pill per producer instead of per consumer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 2 producers, 3 consumers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;queue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(STOP); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Only 1 consumer stops!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: One poison pill per consumer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; consumerCount = 3;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; consumerCount; i++) {
    queue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(STOP);
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 4: Losing tasks on shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Queued tasks might not complete!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Drain queue before shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
List&amp;lt;Runnable&amp;gt; unfinished = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
queue.&lt;span style=&#34;color:#bbb&#34;&gt;drainTo&lt;/span&gt;(unfinished);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Persist unfinished tasks for retry
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;monitoring-queue-health&#34;&gt;Monitoring Queue Health&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MonitoredQueue&lt;/span&gt;&amp;lt;T&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BlockingQueue&amp;lt;T&amp;gt; queue;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; capacity;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MeterRegistry registry;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;MonitoredQueue&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; capacity, MeterRegistry registry) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;queue&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayBlockingQueue&amp;lt;&amp;gt;(capacity);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;capacity&lt;/span&gt; = capacity;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;registry&lt;/span&gt; = registry;
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Monitor queue depth
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;queue.size&amp;#34;&lt;/span&gt;, queue, BlockingQueue::size);
        registry.&lt;span style=&#34;color:#bbb&#34;&gt;gauge&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;queue.utilization&amp;#34;&lt;/span&gt;, queue, 
            q -&amp;gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt;) q.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() / capacity);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;put&lt;/span&gt;(T item) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        queue.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(item);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; duration = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;() - startTime;
        
        registry.&lt;span style=&#34;color:#bbb&#34;&gt;timer&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;queue.put.time&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;record&lt;/span&gt;(duration, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Alert if blocking for too long
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (duration &amp;gt; TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;toNanos&lt;/span&gt;(1)) {
            logger.&lt;span style=&#34;color:#bbb&#34;&gt;warn&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Producer blocked for {}ms&amp;#34;&lt;/span&gt;, 
                TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;(duration));
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;part-2-summary-core-synchronization-patterns&#34;&gt;Part 2 Summary: Core Synchronization Patterns&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve covered &lt;strong&gt;4 fundamental synchronization tools&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Key Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CyclicBarrier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixed multi-phase work&lt;/td&gt;
&lt;td&gt;Can&amp;rsquo;t change party count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semaphore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource limiting&lt;/td&gt;
&lt;td&gt;Must remember to release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ThreadFactory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thread customization&lt;/td&gt;
&lt;td&gt;Doesn&amp;rsquo;t prevent leaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BlockingQueue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer-consumer&lt;/td&gt;
&lt;td&gt;Queue can grow unbounded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CyclicBarrier&lt;/strong&gt; resets after each phase—use for iterative multi-phase work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semaphore&lt;/strong&gt; limits resource access—always release in try-finally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThreadFactory&lt;/strong&gt; names threads—makes debugging at 2 AM possible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BlockingQueue&lt;/strong&gt; separates producers from consumers—always use bounded queues&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 3 (Day 97):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DelayQueue - Time-delayed execution with exponential backoff&lt;/li&gt;
&lt;li&gt;ReentrantLock - Fine-grained locking with timeouts&lt;/li&gt;
&lt;li&gt;Phaser - Dynamic multi-phase coordination&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plus:&lt;/strong&gt; Debugging techniques, monitoring patterns, and production readiness checklist&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Previous:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day95&#34;&gt;Day 95 - Java Concurrency Toolkit Part 1: Foundation &amp;amp; Execution Patterns&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day97&#34;&gt;Day 97 - Java Concurrency Toolkit Part 3: Advanced Patterns &amp;amp; Production Readiness&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 95: Java Concurrency Toolkit Part 1 - Foundation &amp; Execution Patterns</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day95/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day95/</id>
    <published>2025-11-21T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Part 1: Foundation &amp;amp; Execution - Deep dive into 6 essential concurrency tools with real-world patterns, performance characteristics, and common pitfalls</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Series Navigation:&lt;/strong&gt; &lt;a href=&#34;#&#34;&gt;Part 1 (You are here)&lt;/a&gt; • &lt;a href=&#34;/posts/java/100DaysOfJava/day96&#34;&gt;Part 2: Core Synchronization&lt;/a&gt; • &lt;a href=&#34;/posts/java/100DaysOfJava/day97&#34;&gt;Part 3: Advanced Patterns&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Concurrency is not parallelism. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.&amp;quot;&lt;/strong&gt; - Rob Pike&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve worked with &lt;code&gt;Executor&lt;/code&gt;, &lt;code&gt;ScheduledExecutorService&lt;/code&gt;, &lt;code&gt;Future&lt;/code&gt;, &lt;code&gt;CompletableFuture&lt;/code&gt;, &lt;code&gt;CountDownLatch&lt;/code&gt;, &lt;code&gt;ReentrantLock&lt;/code&gt; in production, and they&amp;rsquo;ve helped me develop various multi-threaded features. But I realized I was barely scratching the surface of what &lt;code&gt;java.util.concurrent&lt;/code&gt; offers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Primary References:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Goetz, B., et al. (2006). &lt;em&gt;Java Concurrency in Practice&lt;/em&gt;. Addison-Wesley.&lt;/li&gt;
&lt;li&gt;Oracle. (2023). &lt;em&gt;Java SE API Specification&lt;/em&gt;: &lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/package-summary.html&#34;&gt;&lt;code&gt;java.util.concurrent&lt;/code&gt; package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lea, D. (2000). &amp;ldquo;A Java Fork/Join Framework&amp;rdquo;, &lt;em&gt;Science of Computer Programming&lt;/em&gt;, 37(1-3).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is &lt;strong&gt;Part 1 of 3&lt;/strong&gt; where we&amp;rsquo;ll explore the &lt;strong&gt;foundation and execution patterns&lt;/strong&gt;: the core building blocks that power modern concurrent Java applications.&lt;/p&gt;
&lt;h2 id=&#34;series-overview&#34;&gt;Series Overview&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;3-part series&lt;/strong&gt; on Java Concurrency:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1 (Today - Day 95):&lt;/strong&gt; Foundation &amp;amp; Execution&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Executor&lt;/li&gt;
&lt;li&gt;ExecutorService&lt;/li&gt;
&lt;li&gt;ScheduledExecutorService&lt;/li&gt;
&lt;li&gt;Future&lt;/li&gt;
&lt;li&gt;CompletableFuture&lt;/li&gt;
&lt;li&gt;CountDownLatch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 2 (Day 96):&lt;/strong&gt; Core Synchronization Patterns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CyclicBarrier&lt;/li&gt;
&lt;li&gt;Semaphore&lt;/li&gt;
&lt;li&gt;ThreadFactory&lt;/li&gt;
&lt;li&gt;BlockingQueue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part 3 (Day 97):&lt;/strong&gt; Advanced Patterns &amp;amp; Production Readiness&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DelayQueue&lt;/li&gt;
&lt;li&gt;ReentrantLock&lt;/li&gt;
&lt;li&gt;Phaser&lt;/li&gt;
&lt;li&gt;Debugging, Monitoring, Production Patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;quick-reference-part-1-tools-at-a-glance&#34;&gt;Quick Reference: Part 1 Tools at a Glance&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;TL;DR&lt;/th&gt;
&lt;th&gt;Key Gotcha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simplest interface - just &lt;code&gt;execute(Runnable)&lt;/code&gt;. No lifecycle, no results.&lt;/td&gt;
&lt;td&gt;No way to retrieve results or manage lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed thread pool with lifecycle control. Returns &lt;code&gt;Future&lt;/code&gt; for results.&lt;/td&gt;
&lt;td&gt;Must call &lt;code&gt;shutdown()&lt;/code&gt; - thread pools leak otherwise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScheduledExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Schedules tasks for future or periodic execution.&lt;/td&gt;
&lt;td&gt;Exceptions cancel all future executions - wrap in try-catch!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Future&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Represents eventual completion. &lt;strong&gt;Always use &lt;code&gt;get(timeout)&lt;/code&gt;&lt;/strong&gt; - never without.&lt;/td&gt;
&lt;td&gt;Blocking API - blocks calling thread until complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CompletableFuture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Non-blocking async composition (Java&amp;rsquo;s Promises). Chain, combine, handle errors.&lt;/td&gt;
&lt;td&gt;Complex API - use &lt;code&gt;thenCompose&lt;/code&gt; not &lt;code&gt;thenApply(join())&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CountDownLatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-shot countdown. Wait at &lt;code&gt;await()&lt;/code&gt; until &lt;code&gt;countDown()&lt;/code&gt; reaches zero.&lt;/td&gt;
&lt;td&gt;Can&amp;rsquo;t reset. Always countDown in &lt;code&gt;finally&lt;/code&gt; to avoid deadlock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;when-not-to-use-concurrency&#34;&gt;When NOT to Use Concurrency&lt;/h2&gt;
&lt;p&gt;Before we dive in, let&amp;rsquo;s talk about when concurrency is &lt;strong&gt;overkill&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t use concurrency when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your dataset fits in memory and processes in &amp;lt; 100ms sequentially&lt;/li&gt;
&lt;li&gt;The overhead of thread coordination exceeds the benefit&lt;/li&gt;
&lt;li&gt;Your task is inherently sequential (step B depends on step A&amp;rsquo;s result)&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re processing &amp;lt; 1000 items and each takes microseconds&lt;/li&gt;
&lt;li&gt;Debugging complexity isn&amp;rsquo;t worth the performance gain&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Do use concurrency when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have independent tasks that can run in parallel&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re doing I/O (network, disk, database) where threads spend time waiting&lt;/li&gt;
&lt;li&gt;You need to keep your application responsive while background work happens&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re processing large datasets where parallel processing yields measurable gains&lt;/li&gt;
&lt;li&gt;You need to handle multiple concurrent requests (web servers, message processors)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; Measure first. Add concurrency only when sequential processing is proven to be a bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Cost Model:&lt;/strong&gt; Concurrency introduces coordination overhead. By Amdahl&amp;rsquo;s Law, speedup is limited by the sequential fraction of your program (Goetz et al., 2006, Ch. 11). If synchronization overhead exceeds the parallelizable benefit, you&amp;rsquo;ll make things slower. Always profile before parallelizing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;performance-characteristics-reference&#34;&gt;Performance Characteristics Reference&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;CPU Overhead&lt;/th&gt;
&lt;th&gt;Memory Characteristics&lt;/th&gt;
&lt;th&gt;Behavioral Notes&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Minimal; delegates to provided threads&lt;/td&gt;
&lt;td&gt;Submits tasks without lifecycle management&lt;/td&gt;
&lt;td&gt;Fire-and-forget tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low–Medium&lt;/td&gt;
&lt;td&gt;Thread-pool backed; scales with pool size and queue bounds&lt;/td&gt;
&lt;td&gt;Manages worker threads, queues, and shutdown&lt;/td&gt;
&lt;td&gt;Managed task execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScheduledExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Thread-pool plus heap-based delay queues (priority queue)&lt;/td&gt;
&lt;td&gt;Time-based and periodic task execution&lt;/td&gt;
&lt;td&gt;Delayed and recurring tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Future&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very Low&lt;/td&gt;
&lt;td&gt;Single object reference (~40-60 bytes) per task&lt;/td&gt;
&lt;td&gt;Represents eventual completion; blocking get()&lt;/td&gt;
&lt;td&gt;Simple result retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CompletableFuture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low–Medium&lt;/td&gt;
&lt;td&gt;Base object + callback chain (~200-400 bytes per composition)&lt;/td&gt;
&lt;td&gt;Non-blocking composition, async pipelines&lt;/td&gt;
&lt;td&gt;Async workflow chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CountDownLatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very Low&lt;/td&gt;
&lt;td&gt;~32 bytes via AbstractQueuedSynchronizer&lt;/td&gt;
&lt;td&gt;One-shot coordination of thread arrival&lt;/td&gt;
&lt;td&gt;Release-on-countdown scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Memory characteristics based on HotSpot JVM defaults. Thread stack size typically 1MB per thread (configurable via &lt;code&gt;-Xss&lt;/code&gt;). See Oracle JVM documentation for platform-specific values.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-foundation-understanding-what-were-building&#34;&gt;The Foundation: Understanding What We&amp;rsquo;re Building&lt;/h2&gt;
&lt;p&gt;Before we dive into the tools, let&amp;rsquo;s get one thing straight. Concurrency in Java isn&amp;rsquo;t about making everything parallel. It&amp;rsquo;s about &lt;strong&gt;structuring your code to handle multiple concerns efficiently&lt;/strong&gt;. Sometimes that means parallel execution. Sometimes it means coordinating sequential tasks across threads. Sometimes it&amp;rsquo;s about protecting shared state from chaos.&lt;/p&gt;
&lt;p&gt;Think of it like a busy restaurant kitchen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A head chef coordinating tasks (Executor)&lt;/li&gt;
&lt;li&gt;Managed cooking stations (ExecutorService)&lt;/li&gt;
&lt;li&gt;Timer-based prep work (ScheduledExecutorService)&lt;/li&gt;
&lt;li&gt;Order tickets (Future)&lt;/li&gt;
&lt;li&gt;Complex recipe flows (CompletableFuture)&lt;/li&gt;
&lt;li&gt;Waiting for all dishes before serving (CountDownLatch)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-executor-the-fire-and-forget-pattern&#34;&gt;1. Executor: The Fire-and-Forget Pattern&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Simplest interface - just &lt;code&gt;execute(Runnable)&lt;/code&gt;. No lifecycle, no results. Perfect for async side effects like logging or metrics where you don&amp;rsquo;t need to wait for completion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Your request thread is too precious to waste on side tasks like logging or metrics.&lt;/p&gt;
&lt;p&gt;This is one pattern I&amp;rsquo;ve used extensively. When you&amp;rsquo;re processing API requests, offloading non-critical work like logging enrichment to background threads can significantly improve response times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Offload non-critical work to background threads.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.Executor&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.Instant&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.Executors&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;AsyncLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Executor logExecutor = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadExecutor&lt;/span&gt;(r -&amp;gt; {
        Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;async-logger&amp;#34;&lt;/span&gt;);
        t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Won&amp;#39;t prevent JVM shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
    });
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;logRequestAsync&lt;/span&gt;(String userId, String endpoint, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; statusCode) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Request thread returns immediately
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        logExecutor.&lt;span style=&#34;color:#bbb&#34;&gt;execute&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Background thread does the heavy lifting
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            String enrichedLog = enrichLog(userId, endpoint, statusCode);
            writeToElasticsearch(enrichedLog);
        });
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;enrichLog&lt;/span&gt;(String userId, String endpoint, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; statusCode) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Fetch user details, geo-location, etc.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;[%s] User: %s | Endpoint: %s | Status: %d&amp;#34;&lt;/span&gt;, 
                             Instant.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;(), userId, endpoint, statusCode);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;writeToElasticsearch&lt;/span&gt;(String log) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Writing to ES: &amp;#34;&lt;/span&gt; + log);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; &lt;code&gt;Executor&lt;/code&gt; is the simplest interface—just &lt;code&gt;execute(Runnable)&lt;/code&gt;. No lifecycle management, no result handling. Perfect for fire-and-forget side effects.&lt;/p&gt;
&lt;h3 id=&#34;trade-offs-and-limitations&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minimal overhead&lt;/li&gt;
&lt;li&gt;Simple API&lt;/li&gt;
&lt;li&gt;Request thread returns immediately&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No result retrieval mechanism&lt;/li&gt;
&lt;li&gt;No lifecycle management (can&amp;rsquo;t shut down gracefully)&lt;/li&gt;
&lt;li&gt;No built-in error handling&lt;/li&gt;
&lt;li&gt;Can&amp;rsquo;t limit concurrent task count&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;When it goes wrong:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//  DANGER: Unbounded task submission
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Executor executor = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newCachedThreadPool&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1_000_000; i++) {
    executor.&lt;span style=&#34;color:#bbb&#34;&gt;execute&lt;/span&gt;(() -&amp;gt; {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// If tasks take longer than submission rate,
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// you&amp;#39;ll create 1 million threads = OOM!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    });
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Oracle Java SE API - &lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/Executors.html#newCachedThreadPool()&#34;&gt;&lt;code&gt;Executors.newCachedThreadPool()&lt;/code&gt;&lt;/a&gt;: &amp;ldquo;Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available.&amp;rdquo; - No upper bound documented.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using daemon threads for critical work (logs might be lost on JVM shutdown) - &lt;em&gt;Reference: Java Language Specification §12.8: The JVM exits when all non-daemon threads terminate.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;No backpressure mechanism (can overwhelm the executor)&lt;/li&gt;
&lt;li&gt;Losing exceptions (they&amp;rsquo;re swallowed unless you add explicit handling)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-executorservice-when-you-need-control&#34;&gt;2. ExecutorService: When You Need Control&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Managed thread pool with lifecycle control. Returns &lt;code&gt;Future&lt;/code&gt; for results. Use &lt;code&gt;invokeAll()&lt;/code&gt; for batch processing. Always shutdown: &lt;code&gt;shutdown()&lt;/code&gt; → &lt;code&gt;awaitTermination()&lt;/code&gt; → &lt;code&gt;shutdownNow()&lt;/code&gt;. Size pool based on workload (CPU vs I/O).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Processing a large product catalog where each item needs enrichment from multiple services—pricing, inventory, and reviews. Sequential processing is too slow.&lt;/p&gt;
&lt;p&gt;This is a classic scenario where parallel processing &lt;em&gt;can&lt;/em&gt; provide speedup—&lt;strong&gt;if I/O wait time dominates compute time&lt;/strong&gt;. Concurrency benefit depends on latency distribution and CPU contention (Goetz et al., 2006, Ch. 8). Instead of waiting for each item to complete before starting the next, we can process multiple items concurrently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Parallel processing with controlled thread pool and result collection.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;89
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ProductEnrichmentService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService pool;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ProductEnrichmentService&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; threadCount) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;pool&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(threadCount);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; List&amp;lt;Product&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;enrichProducts&lt;/span&gt;(List&amp;lt;Product&amp;gt; products) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Enriching &amp;#34;&lt;/span&gt; + products.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; products using &amp;#34;&lt;/span&gt; + 
                         Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; threads&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Convert products to Callable tasks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        List&amp;lt;Callable&amp;lt;Product&amp;gt;&amp;gt; tasks = products.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(product -&amp;gt; (Callable&amp;lt;Product&amp;gt;) () -&amp;gt; enrichSingleProduct(product))
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Execute all tasks and wait for completion
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        List&amp;lt;Future&amp;lt;Product&amp;gt;&amp;gt; futures = pool.&lt;span style=&#34;color:#bbb&#34;&gt;invokeAll&lt;/span&gt;(tasks);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Collect results
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        List&amp;lt;Product&amp;gt; enriched = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Future&amp;lt;Product&amp;gt; future : futures) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                enriched.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(future.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;());
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (ExecutionException e) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to enrich product: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getCause&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            }
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; duration = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;() - startTime;
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Enrichment completed in &amp;#34;&lt;/span&gt; + duration + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; enriched;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Product &lt;span style=&#34;color:#447fcf&#34;&gt;enrichSingleProduct&lt;/span&gt;(Product product) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate calling multiple services
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String pricing = fetchPricing(product.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;());
        String inventory = fetchInventory(product.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;());
        String reviews = fetchReviews(product.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;());
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Product(
            product.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;(),
            product.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt;(),
            pricing,
            inventory,
            reviews
        );
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchPricing&lt;/span&gt;(String id) {
        sleep(50); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate API call
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;$99.99&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchInventory&lt;/span&gt;(String id) {
        sleep(30);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;In Stock&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchReviews&lt;/span&gt;(String id) {
        sleep(40);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;4.5 stars&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)) {
                pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdownNow&lt;/span&gt;();
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdownNow&lt;/span&gt;();
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sleep&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; ms) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ms); } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {}
    }
}

record &lt;span style=&#34;color:#447fcf&#34;&gt;Product&lt;/span&gt;(String id, String name, String pricing, String inventory, String reviews) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;trade-offs-and-limitations-1&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lifecycle management (shutdown, awaitTermination)&lt;/li&gt;
&lt;li&gt;Result collection via Future&lt;/li&gt;
&lt;li&gt;Controlled parallelism&lt;/li&gt;
&lt;li&gt;Can batch submit tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed thread pool size (need to tune)&lt;/li&gt;
&lt;li&gt;Blocking result retrieval&lt;/li&gt;
&lt;li&gt;No built-in composition&lt;/li&gt;
&lt;li&gt;Manual error handling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sizing Your Thread Pool:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For CPU-bound tasks:
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; cpuBoundPoolSize = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;();

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For I/O-bound tasks (rule of thumb):
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; ioBoundPoolSize = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;() * 2;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// More precise I/O formula (derived from Little&amp;#39;s Law):
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ThreadCount = NumCores * (1 + WaitTime/ComputeTime)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example: 8 cores, 90% wait time, 10% compute
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// = 8 * (1 + 0.9/0.1) = 8 * 10 = 80 threads
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Goetz et al., 2006, Chapter 8 (&amp;ldquo;Applying Thread Pools&amp;rdquo;): Thread pool sizing using Little&amp;rsquo;s Law and utilization analysis.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 1: Forgetting to shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; doWork());
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Pool never shuts down = thread leak!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Always shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; doWork()).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Wrong pool type
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newCachedThreadPool&lt;/span&gt;();
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For I/O: Can create unlimited threads = OOM
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 3: Ignoring RejectedExecutionException
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; doWork()); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Throws RejectedExecutionException
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Modern Java Note:&lt;/strong&gt; &lt;code&gt;Executors&lt;/code&gt; factory methods are convenient but lack configurability. For production systems, consider direct &lt;code&gt;ThreadPoolExecutor&lt;/code&gt; construction with explicit queue bounds and rejection policies. Java 21+ introduces Structured Concurrency (JEP 453) and Scoped Values (JEP 446) for safer concurrent patterns.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Reference: OpenJDK JEP 453: Structured Concurrency (Preview) - &lt;a href=&#34;https://openjdk.org/jeps/453&#34;&gt;https://openjdk.org/jeps/453&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-scheduledexecutorservice-time-based-automation&#34;&gt;3. ScheduledExecutorService: Time-Based Automation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Schedules tasks for future or periodic execution. Use &lt;code&gt;scheduleAtFixedRate()&lt;/code&gt; for fixed intervals, &lt;code&gt;scheduleWithFixedDelay()&lt;/code&gt; for guaranteed gaps. Wrap tasks in try-catch - exceptions cancel future executions!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; OAuth tokens expire every hour. If we don&amp;rsquo;t refresh them, API calls start failing. Can&amp;rsquo;t rely on manual intervention.&lt;/p&gt;
&lt;p&gt;This is another pattern I&amp;rsquo;ve implemented in production. Scheduled tasks are perfect for periodic maintenance work like token refresh, health checks, or cache cleanup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Automated token refresh with scheduled tasks.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.Instant&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.atomic.AtomicReference&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;TokenRefreshService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ScheduledExecutorService scheduler;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; AtomicReference&amp;lt;String&amp;gt; currentToken;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;TokenRefreshService&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;scheduler&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadScheduledExecutor&lt;/span&gt;(r -&amp;gt; {
            Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
            t.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;token-refresher&amp;#34;&lt;/span&gt;);
            t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Important: ensure refresh completes before shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
        });
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;currentToken&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AtomicReference&amp;lt;&amp;gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;startRefreshCycle&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Starting token refresh cycle at &amp;#34;&lt;/span&gt; + Instant.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;());
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Initial refresh
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        refreshToken();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Schedule periodic refresh every 50 minutes (tokens expire in 60)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::refreshToken,
            50,              &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// initial delay
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            50,              &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// period
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MINUTES&lt;/span&gt;
        );
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Token will refresh every 50 minutes&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;refreshToken&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;[&amp;#34;&lt;/span&gt; + Instant.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;] Refreshing token...&amp;#34;&lt;/span&gt;);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate OAuth flow
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            String newToken = callAuthServer();
            currentToken.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(newToken);
            
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Token refreshed successfully&amp;#34;&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Token refresh failed: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In production: alert ops team, retry with exponential backoff
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;callAuthServer&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate network delay
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(200); } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {}
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;token_&amp;#34;&lt;/span&gt; + System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getCurrentToken&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; currentToken.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;scheduleatfixedrate-vs-schedulewithfixeddelay&#34;&gt;scheduleAtFixedRate vs scheduleWithFixedDelay&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// scheduleAtFixedRate: Next task starts at T + period (can overlap!)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(task, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// If task takes 2 seconds, tasks will queue up!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// scheduleWithFixedDelay: Next task starts after (task completion + delay)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleWithFixedDelay&lt;/span&gt;(task, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Guarantees 1 second gap between task completion and next start
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;trade-offs-and-limitations-2&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Built-in timing mechanism&lt;/li&gt;
&lt;li&gt;Periodic execution&lt;/li&gt;
&lt;li&gt;One-shot delayed execution&lt;/li&gt;
&lt;li&gt;Multiple scheduled tasks on same scheduler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If task takes longer than period, tasks queue up (scheduleAtFixedRate)&lt;/li&gt;
&lt;li&gt;Exceptions cancel future executions - &lt;em&gt;Reference: Oracle Java SE API - &lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html&#34;&gt;&lt;code&gt;ScheduledExecutorService&lt;/code&gt;&lt;/a&gt;: &amp;ldquo;If any execution of the task encounters an exception, subsequent executions are suppressed.&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;No built-in retry logic&lt;/li&gt;
&lt;li&gt;Clock drift not handled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: Long-running task with scheduleAtFixedRate
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(() -&amp;gt; {
    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(5000); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 5 seconds
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Every 1 second
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Tasks pile up! Queue grows indefinitely
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Use scheduleWithFixedDelay for long tasks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleWithFixedDelay&lt;/span&gt;(() -&amp;gt; {
    Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(5000);
}, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Next task starts 1 second AFTER previous completes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: Not handling exceptions
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Math.&lt;span style=&#34;color:#bbb&#34;&gt;random&lt;/span&gt;() &amp;gt; 0.&lt;span style=&#34;color:#bbb&#34;&gt;5&lt;/span&gt;) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Boom!&amp;#34;&lt;/span&gt;);
    }
    doWork();
}, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// First exception silently cancels ALL future executions!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Wrap in try-catch
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;scheduler.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Math.&lt;span style=&#34;color:#bbb&#34;&gt;random&lt;/span&gt;() &amp;gt; 0.&lt;span style=&#34;color:#bbb&#34;&gt;5&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Boom!&amp;#34;&lt;/span&gt;);
        }
        doWork();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task failed: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Task continues running
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}, 0, 1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-future-timeouts-save-lives&#34;&gt;4. Future: Timeouts Save Lives&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Represents eventual completion of async task. &lt;strong&gt;Always use &lt;code&gt;get(timeout)&lt;/code&gt;&lt;/strong&gt; - never &lt;code&gt;get()&lt;/code&gt; without timeout. Can cancel running tasks (if they respect interruption). Blocking API - use CompletableFuture for non-blocking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Calling external services that might hang or respond slowly. Without timeouts, your application threads get stuck waiting indefinitely.&lt;/p&gt;
&lt;p&gt;Timeout enforcement is critical for resilient systems. Whether it&amp;rsquo;s a payment gateway, external API, or database query, you need a way to fail fast and recover gracefully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Strict timeout enforcement with Future.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;PaymentGateway&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService pool;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; timeoutMs;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;PaymentGateway&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; timeoutMs) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;pool&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;timeoutMs&lt;/span&gt; = timeoutMs;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; PaymentResult &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(PaymentRequest request) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Processing payment for $&amp;#34;&lt;/span&gt; + request.&lt;span style=&#34;color:#bbb&#34;&gt;amount&lt;/span&gt;());
        
        Future&amp;lt;PaymentResult&amp;gt; future = pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; callExternalGateway(request);
        });
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Enforce strict timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            PaymentResult result = future.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(timeoutMs, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment successful: &amp;#34;&lt;/span&gt; + result.&lt;span style=&#34;color:#bbb&#34;&gt;transactionId&lt;/span&gt;());
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (TimeoutException e) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Cancel the stuck task
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            future.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment timed out after &amp;#34;&lt;/span&gt; + timeoutMs + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PaymentResult(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TIMEOUT&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment gateway timeout&amp;#34;&lt;/span&gt;);
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (ExecutionException e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment failed: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getCause&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PaymentResult(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;FAILED&amp;#34;&lt;/span&gt;, e.&lt;span style=&#34;color:#bbb&#34;&gt;getCause&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;interrupt&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PaymentResult(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;INTERRUPTED&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment interrupted&amp;#34;&lt;/span&gt;);
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; PaymentResult &lt;span style=&#34;color:#447fcf&#34;&gt;callExternalGateway&lt;/span&gt;(PaymentRequest request) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate variable latency
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(100, 2000));
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Gateway call interrupted&amp;#34;&lt;/span&gt;);
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PaymentResult(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TXN_&amp;#34;&lt;/span&gt; + System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;(), &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;SUCCESS&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
}

record &lt;span style=&#34;color:#447fcf&#34;&gt;PaymentRequest&lt;/span&gt;(String userId, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount) {}
record &lt;span style=&#34;color:#447fcf&#34;&gt;PaymentResult&lt;/span&gt;(String transactionId, String status) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;trade-offs-and-limitations-3&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple timeout enforcement&lt;/li&gt;
&lt;li&gt;Can cancel running tasks&lt;/li&gt;
&lt;li&gt;Works with any ExecutorService&lt;/li&gt;
&lt;li&gt;Exception handling built-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blocking API (future.get() blocks)&lt;/li&gt;
&lt;li&gt;No composition (can&amp;rsquo;t chain Futures)&lt;/li&gt;
&lt;li&gt;Cancellation may not work (task must respect interruption)&lt;/li&gt;
&lt;li&gt;One result only, no streaming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Critical Lesson:&lt;/strong&gt; Always set timeouts on external calls. A slow dependency without timeout protection can create cascading failures throughout your system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: future.get() without timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Future&amp;lt;String&amp;gt; future = pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; callExternalApi());
String result = future.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks FOREVER if API hangs!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Always use timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Future&amp;lt;String&amp;gt; future = pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; callExternalApi());
String result = future.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(5, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: Assuming cancel() stops the task
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Future&amp;lt;?&amp;gt; future = pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Ignores interruption!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        doWork();
    }
});
future.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Task keeps running!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Respect interruption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;Future&amp;lt;?&amp;gt; future = pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (!Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;isInterrupted&lt;/span&gt;()) {
        doWork();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Thread.&lt;span style=&#34;color:#bbb&#34;&gt;interrupted&lt;/span&gt;()) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check interruption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task gracefully stopped&amp;#34;&lt;/span&gt;);
});
future.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Task stops
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Goetz et al., 2006, Chapter 7 (&amp;ldquo;Cancellation and Shutdown&amp;rdquo;): Proper interruption handling patterns.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-completablefuture-async-pipelines&#34;&gt;5. CompletableFuture: Async Pipelines&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Non-blocking async composition (Java&amp;rsquo;s answer to Promises). Chain with &lt;code&gt;thenApply/thenCompose&lt;/code&gt;, combine with &lt;code&gt;allOf/anyOf&lt;/code&gt;, handle errors with &lt;code&gt;exceptionally/handle&lt;/code&gt;. Powerful but complex - practice required. Always specify executor pool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You need to call multiple services in a chain, handle errors at each step, and compose results—all without blocking threads.&lt;/p&gt;
&lt;p&gt;CompletableFuture is Java&amp;rsquo;s way to JavaScript Promises. It&amp;rsquo;s powerful, composable, and non-blocking when used correctly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Build async pipelines with proper error handling.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;109
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;110
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;111
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;112
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;113
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;114
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;115
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;116
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;117
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;118
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;119
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;120
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;121
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;122
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;123
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;124
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;125
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;126
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;127
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;128
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;129
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;130
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;131
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;132
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;133
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;134
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;135
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;136
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;137
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;138
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;139
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;140
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;141
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;142
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;143
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;144
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;145
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;146
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;147
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;148
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;149
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;150
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;151
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;152
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;153
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;154
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;155
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;156
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;157
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;158
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;159
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;160
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;161
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;162
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;163
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;164
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;165
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;166
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;167
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;168
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;169
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;170
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;171
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;172
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;173
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;174
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;175
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;176
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;177
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;178
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;179
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;180
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;181
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;182
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;183
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;184
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;185
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;186
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;187
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;188
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;189
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;190
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;191
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;192
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.Duration&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;OrderProcessingService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService pool;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;OrderProcessingService&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;pool&lt;/span&gt; = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(
            Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;() * 2
        );
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example 1: Sequential async chain
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CompletableFuture&amp;lt;OrderConfirmation&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processOrder&lt;/span&gt;(String orderId) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Step 1: Validate order
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; validateOrder(orderId), pool)
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Step 2: Check inventory (depends on validation)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;thenCompose&lt;/span&gt;(order -&amp;gt; 
                CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; checkInventory(order), pool)
            )
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Step 3: Process payment (depends on inventory)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;thenCompose&lt;/span&gt;(order -&amp;gt;
                CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; processPayment(order), pool)
            )
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Step 4: Ship order (depends on payment)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;thenApply&lt;/span&gt;(order -&amp;gt; shipOrder(order))
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Handle any errors in the chain
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(ex -&amp;gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Order processing failed: &amp;#34;&lt;/span&gt; + ex.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OrderConfirmation(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;FAILED&amp;#34;&lt;/span&gt;, ex.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            })
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Add timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;orTimeout&lt;/span&gt;(10, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Fallback if timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(ex -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (ex &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; TimeoutException) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OrderConfirmation(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TIMEOUT&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Processing timed out&amp;#34;&lt;/span&gt;);
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OrderConfirmation(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ERROR&amp;#34;&lt;/span&gt;, ex.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            });
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example 2: Parallel async calls
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CompletableFuture&amp;lt;ProductDetails&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getProductDetails&lt;/span&gt;(String productId) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Make three independent API calls in parallel
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        CompletableFuture&amp;lt;String&amp;gt; pricingFuture = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; fetchPricing(productId), pool);
        
        CompletableFuture&amp;lt;String&amp;gt; inventoryFuture = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; fetchInventory(productId), pool);
        
        CompletableFuture&amp;lt;String&amp;gt; reviewsFuture = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; fetchReviews(productId), pool);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Combine all results
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;allOf&lt;/span&gt;(pricingFuture, inventoryFuture, reviewsFuture)
            .&lt;span style=&#34;color:#bbb&#34;&gt;thenApply&lt;/span&gt;(v -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProductDetails(
                productId,
                pricingFuture.&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;(),    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Safe: already completed
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                inventoryFuture.&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;(),
                reviewsFuture.&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;()
            ));
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example 3: Race multiple services (use fastest)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CompletableFuture&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getQuote&lt;/span&gt;(String symbol) {
        CompletableFuture&amp;lt;String&amp;gt; exchange1 = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; callExchange1(symbol), pool);
        
        CompletableFuture&amp;lt;String&amp;gt; exchange2 = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; callExchange2(symbol), pool);
        
        CompletableFuture&amp;lt;String&amp;gt; exchange3 = 
            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; callExchange3(symbol), pool);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Return whichever completes first
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;anyOf&lt;/span&gt;(exchange1, exchange2, exchange3)
            .&lt;span style=&#34;color:#bbb&#34;&gt;thenApply&lt;/span&gt;(result -&amp;gt; (String) result);
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example 4: Complex error handling
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CompletableFuture&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;robustServiceCall&lt;/span&gt;(String request) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture
            .&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; callUnreliableService(request), pool)
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Handle specific exceptions differently
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;handle&lt;/span&gt;((result, ex) -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (ex != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (ex.&lt;span style=&#34;color:#bbb&#34;&gt;getCause&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; TimeoutException) {
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TIMEOUT_FALLBACK&amp;#34;&lt;/span&gt;;
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (ex.&lt;span style=&#34;color:#bbb&#34;&gt;getCause&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; ConnectException) {
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;OFFLINE_FALLBACK&amp;#34;&lt;/span&gt;;
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CompletionException(ex);
                    }
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
            })
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Retry logic with delay
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionallyCompose&lt;/span&gt;(ex -&amp;gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Retrying after failure...&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CompletableFuture
                    .&lt;span style=&#34;color:#bbb&#34;&gt;delayedExecutor&lt;/span&gt;(1, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;, pool)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;execute&lt;/span&gt;(() -&amp;gt; {})
                    .&lt;span style=&#34;color:#bbb&#34;&gt;thenCompose&lt;/span&gt;(v -&amp;gt; 
                        CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(
                            () -&amp;gt; callUnreliableService(request), 
                            pool
                        )
                    );
            });
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Helper methods (simulated)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Order &lt;span style=&#34;color:#447fcf&#34;&gt;validateOrder&lt;/span&gt;(String orderId) {
        sleep(100);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Order(orderId, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;VALIDATED&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Order &lt;span style=&#34;color:#447fcf&#34;&gt;checkInventory&lt;/span&gt;(Order order) {
        sleep(150);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Order(order.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;(), &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;INVENTORY_OK&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Order &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(Order order) {
        sleep(200);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Order(order.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;(), &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;PAID&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; OrderConfirmation &lt;span style=&#34;color:#447fcf&#34;&gt;shipOrder&lt;/span&gt;(Order order) {
        sleep(100);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OrderConfirmation(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;SUCCESS&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Order shipped&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchPricing&lt;/span&gt;(String id) {
        sleep(50);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;$99.99&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchInventory&lt;/span&gt;(String id) {
        sleep(75);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;In Stock&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;fetchReviews&lt;/span&gt;(String id) {
        sleep(60);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;4.5 stars&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;callExchange1&lt;/span&gt;(String symbol) {
        sleep(100);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exchange1: $150.25&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;callExchange2&lt;/span&gt;(String symbol) {
        sleep(80);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exchange2: $150.30&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;callExchange3&lt;/span&gt;(String symbol) {
        sleep(120);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exchange3: $150.20&amp;#34;&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;callUnreliableService&lt;/span&gt;(String request) {
        sleep(100);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Math.&lt;span style=&#34;color:#bbb&#34;&gt;random&lt;/span&gt;() &amp;gt; 0.&lt;span style=&#34;color:#bbb&#34;&gt;7&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Service temporarily unavailable&amp;#34;&lt;/span&gt;);
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;SUCCESS: &amp;#34;&lt;/span&gt; + request;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sleep&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; ms) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; { Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ms); } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {}
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shutdown&lt;/span&gt;() {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
}

record &lt;span style=&#34;color:#447fcf&#34;&gt;Order&lt;/span&gt;(String id, String status) {}
record &lt;span style=&#34;color:#447fcf&#34;&gt;OrderConfirmation&lt;/span&gt;(String status, String message) {}
record &lt;span style=&#34;color:#447fcf&#34;&gt;ProductDetails&lt;/span&gt;(String id, String pricing, String inventory, String reviews) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;completablefuture-key-methods&#34;&gt;CompletableFuture Key Methods:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;supplyAsync()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start async computation with result&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runAsync()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start async computation without result&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenApply()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transform result (sync)&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenApplyAsync()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transform result (async)&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenCompose()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chain dependent futures (flatMap)&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thenCombine()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combine two independent futures&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allOf()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait for all to complete&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anyOf()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait for first to complete&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exceptionally()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Handle error, return fallback&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;handle()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Handle both success and error&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orTimeout()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add timeout&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;completeOnTimeout()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provide default on timeout&lt;/td&gt;
&lt;td&gt;CompletableFuture&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;trade-offs-and-limitations-4&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Non-blocking composition&lt;/li&gt;
&lt;li&gt;Rich API for chaining&lt;/li&gt;
&lt;li&gt;Built-in error handling&lt;/li&gt;
&lt;li&gt;Timeout support (Java 9+)&lt;/li&gt;
&lt;li&gt;Can combine multiple futures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complex API with many methods&lt;/li&gt;
&lt;li&gt;Easy to create memory leaks (uncompleted futures)&lt;/li&gt;
&lt;li&gt;Exception handling can be tricky&lt;/li&gt;
&lt;li&gt;Default pool (ForkJoinPool.commonPool()) might not be suitable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//  MISTAKE 1: Using join() instead of thenCompose()
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture&amp;lt;User&amp;gt; userFuture = getUserAsync(userId);
CompletableFuture&amp;lt;Orders&amp;gt; ordersFuture = 
    getOrdersAsync(userFuture.&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getId&lt;/span&gt;()); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// BLOCKS!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Chain with thenCompose
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture&amp;lt;Orders&amp;gt; ordersFuture = getUserAsync(userId)
    .&lt;span style=&#34;color:#bbb&#34;&gt;thenCompose&lt;/span&gt;(user -&amp;gt; getOrdersAsync(user.&lt;span style=&#34;color:#bbb&#34;&gt;getId&lt;/span&gt;())); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Non-blocking
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 2: Not handling errors
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture&amp;lt;String&amp;gt; future = CompletableFuture
    .&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Boom!&amp;#34;&lt;/span&gt;);
    });
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Exception is swallowed until you call get() or join()
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Handle errors
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture&amp;lt;String&amp;gt; future = CompletableFuture
    .&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Boom!&amp;#34;&lt;/span&gt;);
    })
    .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(ex -&amp;gt; {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error: &amp;#34;&lt;/span&gt; + ex.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;FALLBACK&amp;#34;&lt;/span&gt;;
    });


&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE 4: Blocking in async callbacks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; step1())
    .&lt;span style=&#34;color:#bbb&#34;&gt;thenApply&lt;/span&gt;(result -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; expensiveBlockingCall(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks thread pool!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    });

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Use thenApplyAsync for blocking ops
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(() -&amp;gt; step1())
    .&lt;span style=&#34;color:#bbb&#34;&gt;thenApplyAsync&lt;/span&gt;(result -&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; expensiveBlockingCall(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Runs on separate thread
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }, customPool);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-countdownlatch-startup-coordination&#34;&gt;6. CountDownLatch: Startup Coordination&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; One-shot countdown mechanism. Threads wait at &lt;code&gt;await()&lt;/code&gt; until count reaches zero via &lt;code&gt;countDown()&lt;/code&gt; calls. Can&amp;rsquo;t reset (use CyclicBarrier for reusable). Always countDown in &lt;code&gt;finally&lt;/code&gt; block to avoid deadlock.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Starting a microservice that depends on multiple other services being healthy. If you start serving traffic before dependencies are ready, requests fail.&lt;/p&gt;
&lt;p&gt;This pattern is essential for graceful application startup, especially in microservice architectures where you need to coordinate multiple async initialization tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Wait for all health checks before accepting traffic.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MicroserviceBootstrap&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;startApplication&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Starting application bootstrap...&amp;#34;&lt;/span&gt;);
        
        List&amp;lt;String&amp;gt; dependencies = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;user-service&amp;#34;&lt;/span&gt;, 
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;payment-service&amp;#34;&lt;/span&gt;, 
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;inventory-service&amp;#34;&lt;/span&gt;
        );
        
        CountDownLatch healthCheckLatch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(dependencies.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
        
        ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newCachedThreadPool&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Launch parallel health checks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (String service : dependencies) {
            pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; healthy = checkServiceHealth(service);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (healthy) {
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(service + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; is healthy&amp;#34;&lt;/span&gt;);
                    healthCheckLatch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(service + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; health check failed&amp;#34;&lt;/span&gt;);
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In production: implement retry logic
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                }
            });
        }
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Waiting for all health checks to complete...&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Block until all services are healthy or timeout
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; allHealthy = healthCheckLatch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(30, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (allHealthy) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;All dependencies healthy. Starting HTTP server...&amp;#34;&lt;/span&gt;);
            startHttpServer();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Health checks timed out. Application startup failed.&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;exit&lt;/span&gt;(1);
        }
        
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;checkServiceHealth&lt;/span&gt;(String service) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate HTTP health check
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(500, 2000));
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Assume success for demo
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;startHttpServer&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;HTTP server started on port 8080&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;visualizing-countdownlatch&#34;&gt;Visualizing CountDownLatch&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1764302698/Untitled-2025-11-28-0958_l1wrub.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;trade-offs-and-limitations-5&#34;&gt;Trade-offs and Limitations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple API (just countDown and await)&lt;/li&gt;
&lt;li&gt;Very low overhead (~32 bytes)&lt;/li&gt;
&lt;li&gt;Can have multiple waiters&lt;/li&gt;
&lt;li&gt;Can timeout&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One-shot only (can&amp;rsquo;t reset)&lt;/li&gt;
&lt;li&gt;Count must be known at creation&lt;/li&gt;
&lt;li&gt;No error propagation&lt;/li&gt;
&lt;li&gt;If countDown() is missed, waiters block forever&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why CountDownLatch?&lt;/strong&gt; It&amp;rsquo;s a one-shot synchronization primitive. Once the count reaches zero, it&amp;rsquo;s done. Perfect for startup coordination where you only need to wait once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: Wrong count
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(5);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Only 3 threads!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        doWork();
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
    });
}
latch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Blocks forever! Count never reaches 0
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Count matches threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; threadCount = 3;
CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(threadCount);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; threadCount; i++) {
    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
        doWork();
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
    });
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// MISTAKE: Forgetting countDown on error
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (checkHealth()) {
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
    }
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// If check fails, count is never decremented!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Always countDown (use finally)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        checkHealth();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Always happens
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;common-anti-patterns-across-all-tools&#34;&gt;Common Anti-Patterns Across All Tools&lt;/h2&gt;
&lt;h3 id=&#34;1-thread-pool-sizing&#34;&gt;1. Thread Pool Sizing&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ANTI-PATTERN: Magic numbers
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(42);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Calculate based on workload
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; poolSize = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;() * 
               (isCpuBound ? 1 : 2);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-ignoring-shutdown&#34;&gt;2. Ignoring Shutdown&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ANTI-PATTERN: No shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; work());
} &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Pool leaks!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// CORRECT: Proper shutdown
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;process&lt;/span&gt;() {
    ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(() -&amp;gt; work()).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;awaitTermination&lt;/span&gt;(60, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-daemon-threads-for-critical-work&#34;&gt;3. Daemon Threads for Critical Work&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ❌ ANTI-PATTERN: Daemon thread for DB writes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadExecutor&lt;/span&gt;(r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM can exit before DB write completes!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
});

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ✅ CORRECT: Non-daemon for critical work
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newSingleThreadExecutor&lt;/span&gt;(r -&amp;gt; {
    Thread t = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(r);
    t.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// JVM waits for completion
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; t;
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;debugging-concurrent-code&#34;&gt;Debugging Concurrent Code&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Essential Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-thread-dumps-with-jstack&#34;&gt;1. Thread Dumps with jstack&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Get process ID&lt;/span&gt;
jps

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Generate thread dump&lt;/span&gt;
jstack &amp;lt;pid&amp;gt; &amp;gt; threaddump.txt

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Look for:&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# - &amp;#34;BLOCKED&amp;#34; threads waiting on locks&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# - &amp;#34;WAITING&amp;#34; threads in park()&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# - Thread pool names (why naming matters!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Oracle JDK Tools - &lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/specs/man/jstack.html&#34;&gt;&lt;code&gt;jstack&lt;/code&gt;&lt;/a&gt;: &amp;ldquo;Prints Java thread stack traces for a Java process.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-threadpoolexecutor-hooks&#34;&gt;2. ThreadPoolExecutor Hooks&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MonitoredThreadPool&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ThreadPoolExecutor {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ThreadLocal&amp;lt;Long&amp;gt; startTime = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ThreadLocal&amp;lt;&amp;gt;();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;MonitoredThreadPool&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; corePoolSize, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxPoolSize) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;(corePoolSize, maxPoolSize, 60L, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;, 
              &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedBlockingQueue&amp;lt;&amp;gt;());
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;beforeExecute&lt;/span&gt;(Thread t, Runnable r) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;beforeExecute&lt;/span&gt;(t, r);
        startTime.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;());
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task starting on thread: &amp;#34;&lt;/span&gt; + t.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;afterExecute&lt;/span&gt;(Runnable r, Throwable t) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; elapsed = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;() - startTime.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task completed in &amp;#34;&lt;/span&gt; + elapsed / 1_000_000 + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (t != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task failed: &amp;#34;&lt;/span&gt; + t.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;afterExecute&lt;/span&gt;(r, t);
        }
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;terminated&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ThreadPool terminated. Completed tasks: &amp;#34;&lt;/span&gt; + 
                         getCompletedTaskCount());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Oracle Java SE API - &lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html&#34;&gt;&lt;code&gt;ThreadPoolExecutor&lt;/code&gt;&lt;/a&gt;: Hook methods &lt;code&gt;beforeExecute&lt;/code&gt;, &lt;code&gt;afterExecute&lt;/code&gt;, and &lt;code&gt;terminated&lt;/code&gt; for monitoring and debugging.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-detecting-thread-pool-saturation&#34;&gt;3. Detecting Thread Pool Saturation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(10);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Monitor pool health
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; activeCount = pool.&lt;span style=&#34;color:#bbb&#34;&gt;getActiveCount&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; queueSize = pool.&lt;span style=&#34;color:#bbb&#34;&gt;getQueue&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; completedTasks = pool.&lt;span style=&#34;color:#bbb&#34;&gt;getCompletedTaskCount&lt;/span&gt;();

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (queueSize &amp;gt; 1000) {
    System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;WARNING: Thread pool queue saturated!&amp;#34;&lt;/span&gt;);
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Alert ops team, scale horizontally, or apply backpressure
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Reference: Goetz et al., 2006, Chapter 8 (&amp;ldquo;Applying Thread Pools&amp;rdquo;): Monitoring thread pool saturation and tuning.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-common-deadlock-patterns&#34;&gt;4. Common Deadlock Patterns&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 1: locks A, waits for B
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(lockA) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(lockB) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/* ... */&lt;/span&gt; }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Thread 2: locks B, waits for A → DEADLOCK!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(lockB) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt;(lockA) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/* ... */&lt;/span&gt; }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Detection:&lt;/strong&gt; &lt;code&gt;jstack&lt;/code&gt; will report &amp;ldquo;Found one Java-level deadlock&amp;rdquo; and show the lock dependency cycle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Always acquire locks in consistent order (Goetz et al., 2006, Ch. 10).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;part-1-summary-foundation--execution&#34;&gt;Part 1 Summary: Foundation &amp;amp; Execution&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve covered the &lt;strong&gt;foundation of Java concurrency&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Key Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fire-and-forget&lt;/td&gt;
&lt;td&gt;No result retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed thread pools&lt;/td&gt;
&lt;td&gt;Blocking result collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScheduledExecutorService&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Periodic tasks&lt;/td&gt;
&lt;td&gt;Tasks can queue up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Future&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timeout enforcement&lt;/td&gt;
&lt;td&gt;Blocking API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CompletableFuture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Async pipelines&lt;/td&gt;
&lt;td&gt;Complex API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CountDownLatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-shot coordination&lt;/td&gt;
&lt;td&gt;Can&amp;rsquo;t reset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Always set timeouts&lt;/strong&gt; - Blocking forever = production incidents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name your threads&lt;/strong&gt; - Debugging with &amp;ldquo;pool-1-thread-17&amp;rdquo; is painful&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proper shutdown is critical&lt;/strong&gt; - shutdown() → awaitTermination() → shutdownNow()&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match pool size to workload&lt;/strong&gt; - CPU-bound vs I/O-bound need different sizing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CompletableFuture is powerful&lt;/strong&gt; - But requires practice to use correctly&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 2 (Day 96):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CyclicBarrier - Reusable multi-phase coordination&lt;/li&gt;
&lt;li&gt;Semaphore - Resource pool management&lt;/li&gt;
&lt;li&gt;ThreadFactory - Production-ready thread management&lt;/li&gt;
&lt;li&gt;BlockingQueue - Producer-consumer patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Coming in Part 3 (Day 97):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DelayQueue - Time-delayed execution&lt;/li&gt;
&lt;li&gt;ReentrantLock - Fine-grained locking&lt;/li&gt;
&lt;li&gt;Phaser - Dynamic party registration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plus:&lt;/strong&gt; Debugging techniques, monitoring patterns, and production readiness checklist&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;a href=&#34;/posts/java/100DaysOfJava/day96&#34;&gt;Day 96 - Java Concurrency Toolkit Part 2: Core Synchronization Patterns&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 94: Nobody Told Me Java Application Could Start This Fast and The Rabbit hole I explored</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day94/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day94/</id>
    <published>2025-10-30T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Your Java app takes so much time to start. You&amp;rsquo;ve tried everything, or have you? Here&amp;rsquo;s how I cut startup time using techniques you probably haven&amp;rsquo;t tried yet.</summary>
    <content type="html">&lt;p&gt;A few days ago I attended a company knowledge sharing where one of my brilliant colleauges talked about optimizing java memory and performance tuning. Where he talked about spring boot application start up time and how we can shave off some time to load the application faster.&lt;/p&gt;
&lt;p&gt;That night after thinking about it, I fell down the rabbit hole. And what I found gave me lots of ideas. Turns out, I&amp;rsquo;d been thinking about startup time all wrong.&lt;/p&gt;
&lt;h2 id=&#34;my-journey-structure&#34;&gt;My Journey Structure&lt;/h2&gt;
&lt;p&gt;I started with a Jersey application startup problem, but quickly
realized optimization techniques fall into three categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;JVM-level&lt;/strong&gt; (Chapters 1, 4, 5) - Apply to ANY Java app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot-specific&lt;/strong&gt; (Chapters 2, 3) - Research for future projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework-agnostic architecture&lt;/strong&gt; (Chapters 6, 7) - Adaptable to Jersey&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ve marked each technique with its applicability.&lt;/p&gt;
&lt;h2 id=&#34;the-uncomfortable-truth-about-startup-time&#34;&gt;The Uncomfortable Truth About Startup Time&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s something nobody tells you when you&amp;rsquo;re learning Java: &lt;strong&gt;every second of startup time isn&amp;rsquo;t created equal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I used to think &amp;ldquo;JVM starts slow, deal with it.&amp;rdquo; But that&amp;rsquo;s like saying &amp;ldquo;traffic exists, deal with it&amp;rdquo; without asking &lt;em&gt;why&lt;/em&gt; there&amp;rsquo;s traffic or where the bottleneck actually is.&lt;/p&gt;
&lt;p&gt;After digging deep (and I mean JVM logs, profilers, lots of blogs and articles), I discovered a typical breakdown that many Java developers observe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Major part of time goes to classloading&lt;/strong&gt; - The JVM reading and parsing your .class files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For spring another major time spend in bean creation&lt;/strong&gt; - Spring (or your framework) wiring everything together&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Another big chunk of time goes into reflection and proxies&lt;/strong&gt; - All that runtime magic has a cost&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Some of the time goes into I/O&lt;/strong&gt; - Reading configs, connecting to databases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Note: These are approximate distributions based on analysis from Spring Boot team&amp;rsquo;s &lt;a href=&#34;https://spring.io/blog/2018/12/12/how-fast-is-spring&#34;&gt;startup optimization research&lt;/a&gt;, &lt;a href=&#34;https://docs.oracle.com/en/java/javase/17/vm/class-data-sharing.html&#34;&gt;Oracle&amp;rsquo;s JVM performance documentation&lt;/a&gt;, and profiling multiple applications. Your mileage will vary depending on framework, dependencies, and architecture choices.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was dealing with very slow startup time of the Jersey application though, my application loads and verifies a lot of stuff before starting still I think there could be improvements.Once I knew where the time was &lt;em&gt;actually&lt;/em&gt; going, I could fight back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;: Before optimizing anything, jump to
&lt;a href=&#34;#the-measurement-mindset-you-cant-optimize-what-you-dont-measure&#34;&gt;The Measurement Mindset&lt;/a&gt; to learn how to
profile your specific bottlenecks. I&amp;rsquo;m presenting techniques in the
order I discovered them, but you should measure first.&lt;/p&gt;
&lt;h2 id=&#34;chapter-1-the-jvm-strikes-back-or-how-i-learned-to-stop-worrying-and-love-appcds&#34;&gt;Chapter 1: The JVM Strikes Back (Or: How I Learned to Stop Worrying and Love AppCDS)&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s talk about &lt;strong&gt;Class Data Sharing&lt;/strong&gt;. Sounds boring, right? It&amp;rsquo;s not. It&amp;rsquo;s basically a time machine.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the deal: Every time you start your Java app, the JVM loads core classes—String, ArrayList, all those JDK fundamentals. And every time, it does the same work. Parse the class file, verify the bytecode, prepare the internal structures.&lt;/p&gt;
&lt;p&gt;What if&amp;hellip; we could skip that?&lt;/p&gt;
&lt;h3 id=&#34;the-appcds-discovery&#34;&gt;The AppCDS Discovery&lt;/h3&gt;
&lt;p&gt;AppCDS (Application Class Data Sharing) lets you create a snapshot of loaded classes and reuse it. Think of it like meal prepping for your JVM.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I did:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Step 1: Generate a list of classes your app loads&lt;/span&gt;
java -XX:DumpLoadedClassList=classes.lst &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -jar my-app.jar

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Step 2: Create the shared archive&lt;/span&gt;
java -Xshare:dump &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -XX:SharedClassListFile=classes.lst &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -XX:SharedArchiveFile=app-cds.jsa &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -jar my-app.jar

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Step 3: Run with the shared archive&lt;/span&gt;
java -XX:SharedArchiveFile=app-cds.jsa &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -Xshare:on &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -jar my-app.jar
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No code changes. No architecture overhaul. Just telling the JVM to be smarter about something it was already doing.&lt;/p&gt;
&lt;p&gt;APPLIES TO: Any Java 10+ application (not Spring-specific)&lt;/p&gt;
&lt;h2 id=&#34;chapter-2-spring-boots-little-secrets&#34;&gt;Chapter 2: Spring Boot&amp;rsquo;s Little Secrets&lt;/h2&gt;
&lt;p&gt;I love Spring Boot. I really do. But it&amp;rsquo;s like that friend who insists on checking if you locked the door, turned off the stove, and closed the windows—even when you&amp;rsquo;re just running to the mailbox.&lt;/p&gt;
&lt;p&gt;NOTE: While I was exploring Jersey optimization, I researched
these Spring Boot techniques. If you&amp;rsquo;re using Spring Boot, these
will apply directly. For Jersey/other frameworks, focus on the
JVM-level optimizations in Chapters 1, 4, and 5.&lt;/p&gt;
&lt;h3 id=&#34;auto-configuration-the-double-edged-sword&#34;&gt;Auto-Configuration: The Double-Edged Sword&lt;/h3&gt;
&lt;p&gt;Spring Boot&amp;rsquo;s auto-configuration is brilliant for getting started fast. But in production? It&amp;rsquo;s scanning and conditionally configuring things one might &lt;em&gt;never&lt;/em&gt; use.&lt;/p&gt;
&lt;p&gt;One can have lots of &lt;strong&gt;auto-configurations&lt;/strong&gt; enabled, and actually need maybe very few of them.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the before:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@SpringBootApplication&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyApp&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        SpringApplication.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;(MyApp.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;, args);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Simple, right? Too simple. It was doing SO much behind the scenes.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s after I got specific:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@SpringBootApplication&lt;/span&gt;(exclude = {
    DataSourceAutoConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,
    HibernateJpaAutoConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,
    JmxAutoConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,
    RabbitAutoConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,
    MongoAutoConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ... and many others I wasn&amp;#39;t using
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;})
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyApp&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        SpringApplication app = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SpringApplication(MyApp.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        app.&lt;span style=&#34;color:#bbb&#34;&gt;setBannerMode&lt;/span&gt;(Banner.&lt;span style=&#34;color:#bbb&#34;&gt;Mode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;OFF&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Sorry, Spring banner
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        app.&lt;span style=&#34;color:#bbb&#34;&gt;setRegisterShutdownHook&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        app.&lt;span style=&#34;color:#bbb&#34;&gt;setLogStartupInfo&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        app.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;(args);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this will trim down some startup time when a spring boot application is starting up.&lt;/p&gt;
&lt;h3 id=&#34;the-lazy-revolution&#34;&gt;The Lazy Revolution&lt;/h3&gt;
&lt;p&gt;Then I discovered lazy initialization. This was&amp;hellip; controversial.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;spring.main.lazy-initialization=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;One line. Just one line, but it can have great effect.&lt;/p&gt;
&lt;p&gt;What this does is beautiful and slightly dangerous: instead of creating all your beans at startup, Spring creates them when they&amp;rsquo;re first needed.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the catch—and this is important—lazy initialization means errors that would&amp;rsquo;ve shown up at startup now appear later, potentially in production. So I paired it with comprehensive integration tests. You can&amp;rsquo;t just YOLO lazy initialization without safety nets.&lt;/p&gt;
&lt;h3 id=&#34;the-context-indexer-nobody-talks-about&#34;&gt;The Context Indexer Nobody Talks About&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s this little-known Spring dependency that creates a compile-time index of your components:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-context-indexer&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/optional&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;At compile time, it generates &lt;code&gt;META-INF/spring.components&lt;/code&gt;. This means Spring doesn&amp;rsquo;t have to scan your entire classpath looking for &lt;code&gt;@Component&lt;/code&gt; and &lt;code&gt;@Service&lt;/code&gt; annotations—it already knows where they are.&lt;/p&gt;
&lt;h2 id=&#34;chapter-3-the-nuclear-option-graalvm-native-image&#34;&gt;Chapter 3: The Nuclear Option (GraalVM Native Image)&lt;/h2&gt;
&lt;p&gt;At this point, I had to ask myself: how fast could this thing &lt;em&gt;really&lt;/em&gt; go?&lt;/p&gt;
&lt;p&gt;Enter &lt;strong&gt;GraalVM Native Image&lt;/strong&gt;. This is the quantum leap, the paradigm shift, the &amp;ldquo;wait, is this still Java?&amp;rdquo; moment.&lt;/p&gt;
&lt;p&gt;ADVANCED TECHNIQUE: This requires significant build changes and
may not work with all libraries. Evaluate carefully.&lt;/p&gt;
&lt;h3 id=&#34;what-actually-happens&#34;&gt;What Actually Happens&lt;/h3&gt;
&lt;p&gt;Normal Java: JVM starts → loads classes → JIT compiles hot paths → your app runs.&lt;/p&gt;
&lt;p&gt;Native Image: Ahead-of-time compilation → standalone binary → boom, you&amp;rsquo;re running.&lt;/p&gt;
&lt;p&gt;No JVM startup. No classloading. No JIT warmup. Just your app, as a native binary, starting in milliseconds.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I added to my &lt;code&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.graalvm.buildtools&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;native-maven-plugin&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.9.28&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And Spring Boot config:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;spring.aot.enabled=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The build process became&amp;hellip; intense. It would take very long time to build.&lt;/p&gt;
&lt;h3 id=&#34;the-tradeoffs-because-nothing-is-free&#34;&gt;The Tradeoffs (Because Nothing Is Free)&lt;/h3&gt;
&lt;p&gt;Native image isn&amp;rsquo;t magic. It&amp;rsquo;s hardcore static analysis and ahead-of-time compilation. Here&amp;rsquo;s what I learned the hard way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reflection needs hints&lt;/strong&gt; - If you use reflection, you need to tell GraalVM about it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build time increases&lt;/strong&gt; - Significantly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory at startup is fixed&lt;/strong&gt; - No dynamic heap sizing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Some libraries don&amp;rsquo;t work&lt;/strong&gt; - Anything doing crazy bytecode manipulation might break&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For some use cases its Worth it. For a complex enterprise app with tons of reflection? Maybe not.&lt;/p&gt;
&lt;h2 id=&#34;chapter-4-the-forgotten-optimizations&#34;&gt;Chapter 4: The Forgotten Optimizations&lt;/h2&gt;
&lt;p&gt;While we&amp;rsquo;re here, let me share some gems that don&amp;rsquo;t get enough love:&lt;/p&gt;
&lt;h3 id=&#34;the-serial-gc-trick&#34;&gt;The Serial GC Trick&lt;/h3&gt;
&lt;p&gt;For short-lived apps (CLI tools, serverless functions), use the Serial GC:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;-XX:+UseSerialGC
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;G1GC is great for long-running apps, but its initialization overhead is wasted on something that runs for 30 seconds. Serial GC starts faster. Way faster.&lt;/p&gt;
&lt;h3 id=&#34;the-heap-size-paradox&#34;&gt;The Heap Size Paradox&lt;/h3&gt;
&lt;p&gt;I used to think bigger heap = better performance. For startup, it&amp;rsquo;s backwards.&lt;/p&gt;
&lt;p&gt;Large heaps take longer to initialize. The JVM has to zero out that memory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Before (my &amp;#34;bigger is better&amp;#34; phase)&lt;/span&gt;
-Xms2g -Xmx4g

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# After (the &amp;#34;only what I need&amp;#34; enlightenment)  &lt;/span&gt;
-Xms64m -Xmx512m
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For a microservice that uses maybe 200MB at peak? This was a no-brainer.&lt;/p&gt;
&lt;h3 id=&#34;the-tiered-compilation-secret&#34;&gt;The Tiered Compilation Secret&lt;/h3&gt;
&lt;p&gt;Java&amp;rsquo;s JIT has multiple tiers of optimization. For startup-critical apps, you can stop at tier 1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;-XX:TieredStopAtLevel=&lt;span style=&#34;color:#3677a9&#34;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This means: compile with the simple JIT, skip the expensive optimizations. Your steady-state performance will be lower, but startup? Lightning fast.&lt;/p&gt;
&lt;h2 id=&#34;chapter-5-build-and-packagingthe-overlooked-goldmine&#34;&gt;Chapter 5: Build and Packaging—The Overlooked Goldmine&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s something that I found really intriguing when I started researching about startup time reduction: &lt;strong&gt;how you package your app matters as much as what&amp;rsquo;s in it&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;the-fat-jar-double-tax&#34;&gt;The Fat JAR Double Tax&lt;/h3&gt;
&lt;p&gt;Ever wonder why Spring Boot JARs are called &amp;ldquo;fat JARs&amp;rdquo;? They&amp;rsquo;re JARs&amp;hellip; containing JARs. And that means your app gets hit with a double classloader overhead.&lt;/p&gt;
&lt;p&gt;When you run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;java -jar my-app.jar
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;spring-boot-loader&lt;/code&gt; has to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unpack nested JARs (or read them from the archive)&lt;/li&gt;
&lt;li&gt;Create a custom classloader&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Then&lt;/em&gt; load your actual classes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s like having to open a box, to open another box, to get to your actual present.&lt;/p&gt;
&lt;h3 id=&#34;the-exploded-jar-revelation&#34;&gt;The Exploded JAR Revelation&lt;/h3&gt;
&lt;p&gt;Try this instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Extract your fat JAR&lt;/span&gt;
unzip my-app.jar -d app/

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Run directly from the classpath&lt;/span&gt;
java -cp &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;app/BOOT-INF/classes:app/BOOT-INF/lib/*&amp;#34;&lt;/span&gt; com.example.Main
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No nested JARs. No custom classloader. Just straightforward classpath execution.&lt;/p&gt;
&lt;h3 id=&#34;jlink-your-custom-jre-builder&#34;&gt;JLink: Your Custom JRE Builder&lt;/h3&gt;
&lt;p&gt;This one&amp;rsquo;s for the hardcore optimizers. Why ship the entire JDK when you only use a fraction of it?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.baeldung.com/jlink&#34;&gt;JLink&lt;/a&gt; creates a custom Java runtime with &lt;em&gt;only&lt;/em&gt; the modules you need:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# First, see what modules you actually use&lt;/span&gt;
jdeps --print-module-deps my-app.jar

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Then build a custom runtime (example output)&lt;/span&gt;
jlink --module-path &lt;span style=&#34;color:#40ffff&#34;&gt;$JAVA_HOME&lt;/span&gt;/jmods &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;      --add-modules java.base,java.logging,java.sql,java.xml &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;      --output custom-jre &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;      --compress=&lt;span style=&#34;color:#3677a9&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;      --no-header-files &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;      --no-man-pages
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Less to load = faster startup. Plus, your Docker images shrink dramatically.&lt;/p&gt;
&lt;h3 id=&#34;dependency-pruning-the-spring-cleaning-youve-been-avoiding&#34;&gt;Dependency Pruning: The Spring Cleaning You&amp;rsquo;ve Been Avoiding&lt;/h3&gt;
&lt;p&gt;I ran this command and I was like why do we use so many dependencies:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;mvn dependency:tree | grep -c &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jar&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;found &lt;strong&gt;206 dependencies.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Did I need all of them? thats the question I asked Then I started to look which kind of dependencies one can remove?.&lt;/p&gt;
&lt;p&gt;dependencies you can think to remove:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove test-scope dependencies leaking into runtime&lt;/li&gt;
&lt;li&gt;Excluded transitive dependencies thats not being used&lt;/li&gt;
&lt;li&gt;Replace heavy libraries with lighter alternatives if possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example from my sample projects &lt;code&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;exclusions&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- Don&amp;#39;t need embedded Tomcat for this service --&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;exclusion&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-tomcat&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/exclusion&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- Using Log4j2, don&amp;#39;t need Logback --&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;exclusion&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-logging&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/exclusion&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/exclusions&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Each JAR on the classpath is I/O overhead. Less JARs = less scanning = faster startup.&lt;/p&gt;
&lt;h2 id=&#34;chapter-6-architecture-choices-that-compound&#34;&gt;Chapter 6: Architecture Choices That Compound&lt;/h2&gt;
&lt;p&gt;This is where we get strategic. Code-level tweaks are great, but architectural decisions? They multiply your wins.&lt;/p&gt;
&lt;h3 id=&#34;on-demand-initialization-the-ill-get-to-it-later-pattern&#34;&gt;On-Demand Initialization: The &amp;ldquo;I&amp;rsquo;ll Get to It Later&amp;rdquo; Pattern&lt;/h3&gt;
&lt;p&gt;Not everything needs to be ready at startup. Database connection pools? Sure. Your recommendation engine&amp;rsquo;s ML model? Maybe not.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I changed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Before: Everything initialized eagerly
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Bean&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CacheManager &lt;span style=&#34;color:#447fcf&#34;&gt;cacheManager&lt;/span&gt;() {
    CacheManager manager = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CaffeineCacheManager();
    manager.&lt;span style=&#34;color:#bbb&#34;&gt;loadAllCaches&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This takes 2 seconds!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; manager;
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// After: Initialize in the background
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Bean&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; CacheManager &lt;span style=&#34;color:#447fcf&#34;&gt;cacheManager&lt;/span&gt;() {
    CacheManager manager = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CaffeineCacheManager();
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Load caches asynchronously after startup
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;runAsync&lt;/span&gt;(() -&amp;gt; {
        manager.&lt;span style=&#34;color:#bbb&#34;&gt;loadAllCaches&lt;/span&gt;();
        log.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Cache warming complete&amp;#34;&lt;/span&gt;);
    });
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; manager;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;My app now starts, &lt;em&gt;then&lt;/em&gt; warms up the cache.&lt;/p&gt;
&lt;h3 id=&#34;parallel-initialization-multithreading-for-startup&#34;&gt;Parallel Initialization: Multithreading for Startup&lt;/h3&gt;
&lt;p&gt;Why initialize heavy components one-by-one when you have multiple cores?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Configuration&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ParallelInitConfig&lt;/span&gt; {
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Bean&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; ApplicationRunner &lt;span style=&#34;color:#447fcf&#34;&gt;parallelInitializer&lt;/span&gt;(
            DataSource ds,
            CacheManager cache,
            MessagingClient messaging) {
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; args -&amp;gt; {
            CompletableFuture&amp;lt;Void&amp;gt; dbWarmup = CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;runAsync&lt;/span&gt;(() -&amp;gt; {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Warmup database connections
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                ds.&lt;span style=&#34;color:#bbb&#34;&gt;getConnection&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
            });
            
            CompletableFuture&amp;lt;Void&amp;gt; cacheWarmup = CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;runAsync&lt;/span&gt;(() -&amp;gt; {
                cache.&lt;span style=&#34;color:#bbb&#34;&gt;loadCriticalData&lt;/span&gt;();
            });
            
            CompletableFuture&amp;lt;Void&amp;gt; messagingConnect = CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;runAsync&lt;/span&gt;(() -&amp;gt; {
                messaging.&lt;span style=&#34;color:#bbb&#34;&gt;connect&lt;/span&gt;();
            });
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wait for all to complete
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;allOf&lt;/span&gt;(dbWarmup, cacheWarmup, messagingConnect)
                .&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(ex -&amp;gt; {
                logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Startup task failed&amp;#34;&lt;/span&gt;, ex);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
            })
            .&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;();
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Three slow tasks that took 4 seconds sequentially? Now they take 1.5 seconds in parallel.&lt;/p&gt;
&lt;h3 id=&#34;the-static-initializer-trap&#34;&gt;The Static Initializer Trap&lt;/h3&gt;
&lt;p&gt;I found this technique when I was researching:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConfigLoader&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;String, String&amp;gt; CONFIG = loadConfig();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;loadConfig&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reads a 50MB XML file
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Takes 800ms
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; parseXml(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;huge-config.xml&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Every time the JVM loads this class (even if we never use the config), we pay the 800ms tax.&lt;/p&gt;
&lt;p&gt;Fixed version:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConfigLoader&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; Map&amp;lt;String, String&amp;gt; CONFIG;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getConfig&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (CONFIG == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (ConfigLoader.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (CONFIG == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                    CONFIG = parseXml(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;huge-config.xml&amp;#34;&lt;/span&gt;);
                }
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; CONFIG;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now it only loads when actually needed. If this service doesn&amp;rsquo;t use the config? We never pay the cost.&lt;/p&gt;
&lt;h2 id=&#34;chapter-7-code-level-tricks-that-add-up&#34;&gt;Chapter 7: Code-Level Tricks That Add Up&lt;/h2&gt;
&lt;p&gt;The small stuff matters. A lot of small optimizations compound into big wins.&lt;/p&gt;
&lt;h3 id=&#34;the-reflection-tax&#34;&gt;The Reflection Tax&lt;/h3&gt;
&lt;p&gt;Reflection is slow. Classpath scanning for annotations is slower. You know what&amp;rsquo;s fast? Compile-time code generation.&lt;/p&gt;
&lt;p&gt;I replaced this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Service&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DataMapper&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; UserDTO &lt;span style=&#34;color:#447fcf&#34;&gt;toDTO&lt;/span&gt;(User user) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Uses reflection to map fields
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; modelMapper.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(user, UserDTO.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;With &lt;strong&gt;MapStruct&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Mapper&lt;/span&gt;(componentModel = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;spring&amp;#34;&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DataMapper&lt;/span&gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Generated at compile time—zero reflection
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    UserDTO &lt;span style=&#34;color:#447fcf&#34;&gt;toDTO&lt;/span&gt;(User user);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No runtime reflection. No classpath scanning. Just plain old method calls.&lt;/p&gt;
&lt;h3 id=&#34;logging-the-silent-startup-killer&#34;&gt;Logging: The Silent Startup Killer&lt;/h3&gt;
&lt;p&gt;Log4j2, Logback—they&amp;rsquo;re great. But their initialization? Not so much.&lt;/p&gt;
&lt;p&gt;I switched from this config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- log4j2.xml with complex appenders and filters --&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;Configuration&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;Appenders&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;RollingFile&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- Lots of configuration --&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/RollingFile&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/Appenders&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/Configuration&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To programmatic configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Configuration&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;LogConfig&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@PostConstruct&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;configureLogs&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Configure only what we need, when we need it
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        LoggerContext ctx = (LoggerContext) LogManager.&lt;span style=&#34;color:#bbb&#34;&gt;getContext&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
        Configuration config = ctx.&lt;span style=&#34;color:#bbb&#34;&gt;getConfiguration&lt;/span&gt;();
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Minimal setup
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or for services that don&amp;rsquo;t need fancy logging, I went nuclear:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;# Just use simple logging
org.springframework.boot.autoconfigure.logging=false
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;precompiling-configuration&#34;&gt;Precompiling Configuration&lt;/h3&gt;
&lt;p&gt;Every Spring Boot startup, we were parsing this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# application.yml - 500 lines of YAML&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;spring&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;datasource&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# ... 100 lines&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;jpa&lt;/span&gt;:&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# ... 150 lines&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# ... etc&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;YAML parsing isn&amp;rsquo;t free. So I created a build-time step:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// At build time, serialize config to binary
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Component&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConfigCache&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;config.cache&amp;#34;&lt;/span&gt;)) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Load pre-parsed config
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Parse YAML and cache it
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;chapter-8-docker-and-deployment-magic&#34;&gt;Chapter 8: Docker and Deployment Magic&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re running in containers (and who isn&amp;rsquo;t these days?), you can look into these.&lt;/p&gt;
&lt;h3 id=&#34;layered-docker-images-the-smart-way&#34;&gt;Layered Docker Images: The Smart Way&lt;/h3&gt;
&lt;p&gt;Instead of this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt; openjdk:17&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; target/my-app.jar /app.jar&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;CMD&lt;/span&gt; [&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-jar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/app.jar&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Use Spring Boot&amp;rsquo;s layered JARs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt; openjdk:17 as builder&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt; /app&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; target/*.jar app.jar&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;RUN&lt;/span&gt; java -Djarmode=layertools -jar app.jar extract&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt; openjdk:17&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;WORKDIR&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt; /app&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; --from=builder app/dependencies/ ./&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; --from=builder app/spring-boot-loader/ ./&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; --from=builder app/snapshot-dependencies/ ./&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;COPY&lt;/span&gt; --from=builder app/application/ ./&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;org.springframework.boot.loader.JarLauncher&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Why? Docker caches layers. Your app code changes frequently. Your dependencies? Not so much.&lt;/p&gt;
&lt;p&gt;With layered images:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependency layer: cached&lt;/li&gt;
&lt;li&gt;Your code: rebuilds quickly&lt;/li&gt;
&lt;li&gt;Faster builds = faster deployments = less waiting&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-measurement-mindset-you-cant-optimize-what-you-dont-measure&#34;&gt;The Measurement Mindset: You Can&amp;rsquo;t Optimize What You Don&amp;rsquo;t Measure&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s something that changed my whole approach: &lt;strong&gt;actually measuring&lt;/strong&gt; what&amp;rsquo;s slow.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# See what classes are loading&lt;/span&gt;
java -Xlog:class+load=info -jar app.jar

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Enable Spring startup logging&lt;/span&gt;
-Dspring.main.log-startup-info=&lt;span style=&#34;color:#24909d&#34;&gt;true&lt;/span&gt;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Java Flight Recorder for deep profiling&lt;/span&gt;
java -XX:StartFlightRecording=&lt;span style=&#34;color:#40ffff&#34;&gt;filename&lt;/span&gt;=startup.jfr -jar app.jar
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Before I did this, I was optimizing blind. &amp;ldquo;I think Spring is slow, so let me tweak Spring things.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;After? &amp;ldquo;Oh, 1.2 seconds is spent loading Jackson modules I don&amp;rsquo;t even use. Let me exclude those.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Precision beats guessing every time.&lt;/p&gt;
&lt;h2 id=&#34;the-lessons-that-stuck&#34;&gt;The Lessons That Stuck&lt;/h2&gt;
&lt;p&gt;After this whole journey, here&amp;rsquo;s what I learned:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Startup time is composable&lt;/strong&gt; - Every technique stacks. AppCDS + lazy beans + smaller heap = dramatic results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The JVM is smarter than you think&lt;/strong&gt; - But only if you tell it what to optimize&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework defaults optimize for flexibility, not speed&lt;/strong&gt; - You need to get specific&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native Image is real&lt;/strong&gt; - Not a gimmick. Production-ready for the right use cases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measurement changes everything&lt;/strong&gt; - Blind optimization is just guessing with extra steps&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-one-thing-you-should-do-right-now&#34;&gt;The One Thing You Should Do Right Now&lt;/h2&gt;
&lt;p&gt;If you take nothing else from this post, do this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# And this to your JVM args&lt;/span&gt;
-XX:SharedArchiveFile=app-cds.jsa -Xshare:on
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then, if you want more, come back and try the other techniques. But start there.&lt;/p&gt;
&lt;h2 id=&#34;the-end-or-just-the-beginning&#34;&gt;The End? Or Just the Beginning?&lt;/h2&gt;
&lt;p&gt;Why does classloading take so long? What if we cached it?&lt;br&gt;
Why are we creating 300 beans at startup? What if we waited?&lt;br&gt;
Why are we running on the JVM at all? What if we compiled ahead-of-time?&lt;/p&gt;
&lt;p&gt;Every &amp;ldquo;what if&amp;rdquo; openes a new door.&lt;/p&gt;
&lt;p&gt;Your Java app doesn&amp;rsquo;t have to start slow. The tools are there. The techniques work. You just need to start your exloration.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 93: Stop Leaking Passwords - Building Java&#39;s Answer to PHP&#39;s #[SensitiveParameter]</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day93/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day93/</id>
    <published>2025-10-07T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Learn how to create a custom @Sensitive annotation with annotation processing to automatically mask passwords and secrets in your Java applications</summary>
    <content type="html">&lt;h2 id=&#34;the-tweet-that-started-it-all&#34;&gt;The Tweet That Started It All&lt;/h2&gt;
&lt;p&gt;So I&amp;rsquo;m scrolling through X (still calling it Twitter in my head, sorry Elon), and I see this post about PHP 8.2&amp;rsquo;s &lt;code&gt;#[SensitiveParameter]&lt;/code&gt; attribute. My first thought? &amp;ldquo;That&amp;rsquo;s brilliant.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My second thought? &amp;ldquo;Wait, Java doesn&amp;rsquo;t have this?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I mean, we&amp;rsquo;ve got annotations for everything. &lt;code&gt;@Override&lt;/code&gt;, &lt;code&gt;@Deprecated&lt;/code&gt;, &lt;code&gt;@SuppressWarnings&lt;/code&gt;&amp;hellip; but nothing to stop us from accidentally logging passwords? Really?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. We&amp;rsquo;ve all done it. Maybe not you specifically, but someone on your team has definitely written something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;User login: &amp;#34;&lt;/span&gt; + username + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; with password: &amp;#34;&lt;/span&gt; + password)
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And then it sat there. In production. Logging every password attempt to a file that 15 people have access to.&lt;/p&gt;
&lt;p&gt;Or worse, a stack trace helpfully includes method parameters, and suddenly your API keys are in your error monitoring system. Fun times explaining that one to the security team.&lt;/p&gt;
&lt;h2 id=&#34;what-php-got-right-and-why-im-jealous&#34;&gt;What PHP Got Right (And Why I&amp;rsquo;m Jealous)&lt;/h2&gt;
&lt;p&gt;Look, I&amp;rsquo;m not usually one to praise PHP. But credit where it&amp;rsquo;s due.&lt;/p&gt;
&lt;p&gt;PHP 8.2 introduced &lt;code&gt;#[SensitiveParameter]&lt;/code&gt;, and it&amp;rsquo;s dead simple:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://pbs.twimg.com/media/G2FRP80XgAAy7f6?format=jpg&amp;amp;name=large&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Just use that attribute on a parameter, and boom. If an exception gets thrown, the parameter shows up as &lt;code&gt;Object(SensitiveParameterValue)&lt;/code&gt; instead of the actual password. No configuration. No third-party library. Just works.&lt;/p&gt;
&lt;p&gt;I sat there staring at this thinking, &amp;ldquo;Why doesn&amp;rsquo;t Java have this?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re the enterprise language. We&amp;rsquo;re supposed to be all about security and best practices. Yet PHP beat us to this one.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the thing about Java developers (and I say this with love): we don&amp;rsquo;t just copy. We overengineer. I mean&amp;hellip; we &lt;em&gt;engineer&lt;/em&gt; solutions that work with our ecosystem. Yeah, let&amp;rsquo;s go with that.&lt;/p&gt;
&lt;h2 id=&#34;building-our-own-sensitive-because-java-doesnt-have-one&#34;&gt;Building Our Own @Sensitive (Because Java Doesn&amp;rsquo;t Have One)&lt;/h2&gt;
&lt;p&gt;Alright, let&amp;rsquo;s build this thing.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m targeting Java 17+ because honestly, if you&amp;rsquo;re still on Java 8, you&amp;rsquo;ve got bigger problems than password leaking. (Kidding. Sort of. Please update your Java version.)&lt;/p&gt;
&lt;p&gt;My plan is to attack this from three angles:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logging&lt;/strong&gt; - intercept and mask before it hits the logs&lt;br&gt;
&lt;strong&gt;Stack Traces&lt;/strong&gt; - catch exceptions and sanitize them&lt;br&gt;
&lt;strong&gt;String Representation&lt;/strong&gt; - because someone always calls &lt;code&gt;toString()&lt;/code&gt; on the user object&lt;/p&gt;
&lt;p&gt;Could I do it with just one approach? Maybe. But I&amp;rsquo;ve been burned too many times by &amp;ldquo;that one edge case&amp;rdquo; that ruins everything. Defense in depth, right?&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s build this step by step. And yeah, there&amp;rsquo;s gonna be some reflection. Sorry not sorry.&lt;/p&gt;
&lt;h2 id=&#34;step-1-creating-the-sensitive-annotation&#34;&gt;Step 1: Creating the @Sensitive Annotation&lt;/h2&gt;
&lt;p&gt;First things first. We need the annotation itself.&lt;/p&gt;
&lt;p&gt;This is the easy part, which is nice because the next parts get&amp;hellip; interesting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.ElementType&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.Retention&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.RetentionPolicy&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.Target&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Marks a parameter, field, or method as containing sensitive data
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * that should be masked in logs, stack traces, and string representations.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * 
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Inspired by PHP&amp;#39;s #[SensitiveParameter] attribute.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * 
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Example usage:
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * &amp;lt;pre&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * public void login(String username, @Sensitive String password) {
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; *     // password will be masked in any logs or stack traces
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * }
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * &amp;lt;/pre&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#ffa500&#34;&gt;@Retention&lt;/span&gt;(RetentionPolicy.&lt;span style=&#34;color:#bbb&#34;&gt;RUNTIME&lt;/span&gt;)
&lt;span style=&#34;color:#ffa500&#34;&gt;@Target&lt;/span&gt;({ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;PARAMETER&lt;/span&gt;, ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;FIELD&lt;/span&gt;, ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;METHOD&lt;/span&gt;})
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#ffa500&#34;&gt;@interface&lt;/span&gt; Sensitive {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * The mask pattern to use when hiding sensitive data.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Default is &amp;#34;****&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    String &lt;span style=&#34;color:#447fcf&#34;&gt;mask&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;;
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Whether to show partial data (e.g., last 4 digits of credit card)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Default is false - completely mask the data
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;showPartial&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Number of characters to show if showPartial is true
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;partialLength&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; 4;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;See what I did there? I didn&amp;rsquo;t just make a marker annotation (you know, the ones that are just &lt;code&gt;@interface Sensitive {}&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I added options. Because in the real world, you don&amp;rsquo;t always want to completely hide everything. Sometimes you need to show the last 4 digits of a credit card for support purposes. Sometimes you want a custom mask (I once worked at a place that insisted on using &lt;code&gt;[REDACTED]&lt;/code&gt; for everything because someone watched too many spy movies).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;showPartial&lt;/code&gt; option lets you do exactly that. Want to show the last 4 digits? Done. Want a custom mask instead of &lt;code&gt;****&lt;/code&gt;? Easy.&lt;/p&gt;
&lt;p&gt;Is this over-engineering? Probably. Do I care? Not really. Future me will thank current me when the requirements change.&lt;/p&gt;
&lt;h2 id=&#34;step-2-the-data-masking-utility-the-workhorse&#34;&gt;Step 2: The Data Masking Utility (The Workhorse)&lt;/h2&gt;
&lt;p&gt;Okay, annotations are cool and all, but they don&amp;rsquo;t actually &lt;em&gt;do&lt;/em&gt; anything. They&amp;rsquo;re just metadata.&lt;/p&gt;
&lt;p&gt;We need something to actually mask the data. Enter &lt;code&gt;SensitiveDataMasker&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is where the real work happens. Think of it as the bouncer at the club - checking IDs (annotations) and deciding who gets in (what gets logged).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Field&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Parameter&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Utility class for masking sensitive data based on @Sensitive annotations.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveDataMasker&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String DEFAULT_MASK = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;;
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Masks a value based on Sensitive annotation configuration
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;mask&lt;/span&gt;(Object value, Sensitive annotation) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (value == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }
        
        String stringValue = value.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (annotation == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; stringValue;
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!annotation.&lt;span style=&#34;color:#bbb&#34;&gt;showPartial&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; annotation.&lt;span style=&#34;color:#bbb&#34;&gt;mask&lt;/span&gt;();
        }
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Show partial data (e.g., last 4 digits)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; length = stringValue.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; showLength = annotation.&lt;span style=&#34;color:#bbb&#34;&gt;partialLength&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (length &amp;lt;= showLength) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; annotation.&lt;span style=&#34;color:#bbb&#34;&gt;mask&lt;/span&gt;();
        }
        
        String visiblePart = stringValue.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(length - showLength);
        String maskedPart = annotation.&lt;span style=&#34;color:#bbb&#34;&gt;mask&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; maskedPart + visiblePart;
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Masks method parameters that have @Sensitive annotation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Object[] &lt;span style=&#34;color:#447fcf&#34;&gt;maskParameters&lt;/span&gt;(Parameter[] parameters, Object[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (parameters == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || args == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || parameters.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; != args.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; args;
        }
        
        Object[] maskedArgs = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Object[args.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;];
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; parameters.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
            Sensitive annotation = parameters[i].&lt;span style=&#34;color:#bbb&#34;&gt;getAnnotation&lt;/span&gt;(Sensitive.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
            maskedArgs[i] = mask(args[i], annotation);
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; maskedArgs;
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Creates a masked string representation of an object by hiding
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * all fields marked with @Sensitive
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;toMaskedString&lt;/span&gt;(Object obj) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (obj == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;null&amp;#34;&lt;/span&gt;;
        }
        
        StringBuilder sb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; StringBuilder();
        sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(obj.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getSimpleName&lt;/span&gt;()).&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;{&amp;#34;&lt;/span&gt;);
        
        Field[] fields = obj.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredFields&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; first = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Field field : fields) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!first) {
                sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;);
            }
            first = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            
            field.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                Object value = field.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(obj);
                Sensitive annotation = field.&lt;span style=&#34;color:#bbb&#34;&gt;getAnnotation&lt;/span&gt;(Sensitive.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
                
                sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(field.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;()).&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt;);
                
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (annotation != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                    sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(mask(value, annotation));
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                    sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(value);
                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IllegalAccessException e) {
                sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;);
            }
        }
        
        sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;}&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; sb.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This utility is the workhorse of our system. It handles masking individual values, masking method parameters in bulk, and creating masked string representations of entire objects.&lt;/p&gt;
&lt;p&gt;I know what you&amp;rsquo;re thinking. &amp;ldquo;Is that reflection I see?&amp;rdquo; Yes. Yes it is.&lt;/p&gt;
&lt;p&gt;Look, I tried doing this without reflection. I really did. Spent like 2 hours going down the bytecode manipulation rabbit hole with ByteBuddy. Then I remembered the golden rule: solve the problem first, optimize later. Reflection works fine here because we&amp;rsquo;re only using it when something&amp;rsquo;s actually being logged, which isn&amp;rsquo;t exactly a hot path in your application.&lt;/p&gt;
&lt;p&gt;Plus, the JVM&amp;rsquo;s gotten really good at optimizing reflection calls these days. We&amp;rsquo;re not in Java 5 anymore.&lt;/p&gt;
&lt;h2 id=&#34;step-3-custom-exception-handler-for-stack-traces&#34;&gt;Step 3: Custom Exception Handler for Stack Traces&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s where things get interesting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Method&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Parameter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Arrays&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Custom exception wrapper that masks sensitive parameters in stack traces
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveException&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; RuntimeException {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;transient&lt;/span&gt; Object[] originalArgs;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;transient&lt;/span&gt; Object[] maskedArgs;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SensitiveException&lt;/span&gt;(String message, Throwable cause, 
                             Method method, Object[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;(buildMessage(message, method, args), cause);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;originalArgs&lt;/span&gt; = args;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;maskedArgs&lt;/span&gt; = maskArguments(method, args);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SensitiveException&lt;/span&gt;(String message, Method method, Object[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;(message, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, method, args);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Object[] &lt;span style=&#34;color:#447fcf&#34;&gt;maskArguments&lt;/span&gt;(Method method, Object[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (method == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || args == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; args;
        }
        
        Parameter[] parameters = method.&lt;span style=&#34;color:#bbb&#34;&gt;getParameters&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;maskParameters&lt;/span&gt;(parameters, args);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;buildMessage&lt;/span&gt;(String message, Method method, Object[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (method == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; message;
        }
        
        Parameter[] parameters = method.&lt;span style=&#34;color:#bbb&#34;&gt;getParameters&lt;/span&gt;();
        Object[] masked = SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;maskParameters&lt;/span&gt;(parameters, args);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%s | Method: %s | Arguments: %s&amp;#34;&lt;/span&gt;, 
            message, 
            method.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), 
            Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(masked));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Object[] &lt;span style=&#34;color:#447fcf&#34;&gt;getMaskedArgs&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; maskedArgs != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ? maskedArgs.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;() : &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So this is basically a wrapper exception. When something goes wrong and you need to throw an exception, you throw this instead. It takes the original exception, looks at the method that caused it, finds any &lt;code&gt;@Sensitive&lt;/code&gt; parameters, and masks them before building the error message.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;transient&lt;/code&gt; keyword on those fields? That&amp;rsquo;s because we don&amp;rsquo;t want masked passwords accidentally getting serialized and sent over the network. Been there, done that, got the post-mortem writeup.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a fun story: I initially didn&amp;rsquo;t make these transient. Deployed to staging. Everything looked great. Then someone serialized an exception for remote logging, and the original args went over the wire. Whoops. Always test your security features end-to-end, folks.&lt;/p&gt;
&lt;h2 id=&#34;step-4-the-aop-interceptor-where-the-magic-happens&#34;&gt;Step 4: The AOP Interceptor (Where the Magic Happens)&lt;/h2&gt;
&lt;p&gt;Okay, this is where we get a bit fancy. AOP - Aspect-Oriented Programming. Sounds scary. It&amp;rsquo;s not.&lt;/p&gt;
&lt;p&gt;Think of it as a spy that sits between your method calls and does stuff before, after, or around them. In our case, it&amp;rsquo;s gonna catch any method with &lt;code&gt;@Sensitive&lt;/code&gt; parameters and mask them before they hit the logs.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.aspectj.lang.ProceedingJoinPoint&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.aspectj.lang.annotation.Around&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.aspectj.lang.annotation.Aspect&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.aspectj.lang.reflect.MethodSignature&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.Logger&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.LoggerFactory&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.springframework.stereotype.Component&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Method&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Parameter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Arrays&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Aspect that automatically masks sensitive parameters in method calls
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * and ensures they don&amp;#39;t leak into logs or exceptions
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#ffa500&#34;&gt;@Aspect&lt;/span&gt;
&lt;span style=&#34;color:#ffa500&#34;&gt;@Component&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveDataAspect&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(SensitiveDataAspect.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Intercept any method that has @Sensitive parameters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Around&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;execution(* *(..)) &amp;amp;&amp;amp; args(.., @Sensitive (*))&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;maskSensitiveParameters&lt;/span&gt;(ProceedingJoinPoint joinPoint) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.&lt;span style=&#34;color:#bbb&#34;&gt;getSignature&lt;/span&gt;();
        Method method = signature.&lt;span style=&#34;color:#bbb&#34;&gt;getMethod&lt;/span&gt;();
        Object[] args = joinPoint.&lt;span style=&#34;color:#bbb&#34;&gt;getArgs&lt;/span&gt;();
        Parameter[] parameters = method.&lt;span style=&#34;color:#bbb&#34;&gt;getParameters&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Mask arguments for logging
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Object[] maskedArgs = SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;maskParameters&lt;/span&gt;(parameters, args);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Log method entry with masked parameters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (logger.&lt;span style=&#34;color:#bbb&#34;&gt;isDebugEnabled&lt;/span&gt;()) {
            logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Entering method: {} with args: {}&amp;#34;&lt;/span&gt;, 
                method.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), 
                Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(maskedArgs));
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Proceed with the original call
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Object result = joinPoint.&lt;span style=&#34;color:#bbb&#34;&gt;proceed&lt;/span&gt;(args);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (logger.&lt;span style=&#34;color:#bbb&#34;&gt;isDebugEnabled&lt;/span&gt;()) {
                logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exiting method: {} successfully&amp;#34;&lt;/span&gt;, method.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
            }
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Throwable ex) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Wrap exception with masked parameters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exception in method: {} with args: {}&amp;#34;&lt;/span&gt;, 
                method.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), 
                Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(maskedArgs), 
                ex);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SensitiveException(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error in &amp;#34;&lt;/span&gt; + method.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), 
                ex, 
                method, 
                args
            );
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;@Around&lt;/code&gt; annotation is doing the heavy lifting here. That pointcut expression &lt;code&gt;execution(* *(..)) &amp;amp;&amp;amp; args(.., @Sensitive (*))&lt;/code&gt; looks like line noise, I know. But it&amp;rsquo;s saying &amp;ldquo;intercept any method that has at least one parameter with @Sensitive annotation.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Then we mask the args, log them safely, and if anything blows up, we wrap it in our &lt;code&gt;SensitiveException&lt;/code&gt; so the stack trace stays clean.&lt;/p&gt;
&lt;p&gt;One gotcha I ran into: the pointcut has to match the exact signature. I spent 30 minutes wondering why my aspect wasn&amp;rsquo;t firing before I realized I had the wrong number of dots in &lt;code&gt;(..)&lt;/code&gt;. Classic.&lt;/p&gt;
&lt;h2 id=&#34;step-5-the-logback-safety-net&#34;&gt;Step 5: The Logback Safety Net&lt;/h2&gt;
&lt;p&gt;You know what&amp;rsquo;s wild? Even with all the above, I still didn&amp;rsquo;t trust it completely. Because developers are creative. Someone will find a way to log a password directly. I&amp;rsquo;ve seen it happen.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s add one more layer - a Logback encoder that catches common patterns.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ch.qos.logback.classic.spi.ILoggingEvent&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ch.qos.logback.core.filter.Filter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ch.qos.logback.core.spi.FilterReply&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Matcher&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Pattern&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Logback filter that masks sensitive data patterns in log messages
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveLogFilter&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; Filter&amp;lt;ILoggingEvent&amp;gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Pattern PASSWORD_PATTERN = 
        Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;compile&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;(password|pwd|pass|secret|token|key)\\s*[:=]\\s*([^\\s,}]+)&amp;#34;&lt;/span&gt;, 
            Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;CASE_INSENSITIVE&lt;/span&gt;);
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Pattern API_KEY_PATTERN = 
        Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;compile&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;([a-zA-Z0-9]{32,})&amp;#34;&lt;/span&gt;);
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String maskPattern = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FilterReply &lt;span style=&#34;color:#447fcf&#34;&gt;decide&lt;/span&gt;(ILoggingEvent event) {
        String message = event.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (message != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; containsSensitiveData(message)) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Unfortunately, Logback doesn&amp;#39;t allow message modification in filters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This would need to be implemented via a custom Layout instead
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For now, we can at least detect and log a warning
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FilterReply.&lt;span style=&#34;color:#bbb&#34;&gt;NEUTRAL&lt;/span&gt;;
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FilterReply.&lt;span style=&#34;color:#bbb&#34;&gt;NEUTRAL&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;containsSensitiveData&lt;/span&gt;(String message) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; PASSWORD_PATTERN.&lt;span style=&#34;color:#bbb&#34;&gt;matcher&lt;/span&gt;(message).&lt;span style=&#34;color:#bbb&#34;&gt;find&lt;/span&gt;() || 
               API_KEY_PATTERN.&lt;span style=&#34;color:#bbb&#34;&gt;matcher&lt;/span&gt;(message).&lt;span style=&#34;color:#bbb&#34;&gt;find&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setMaskPattern&lt;/span&gt;(String maskPattern) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;maskPattern&lt;/span&gt; = maskPattern;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And the corresponding custom layout for Logback (&lt;code&gt;logback.xml&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;appender&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;CONSOLE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;class=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ch.qos.logback.core.ConsoleAppender&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;encoder&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;class=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;com.example.security.SensitiveMaskingEncoder&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/encoder&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/appender&amp;gt;&lt;/span&gt;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;root&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;level=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;INFO&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;appender-ref&lt;/span&gt; &lt;span style=&#34;color:#bbb&#34;&gt;ref=&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;CONSOLE&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And the encoder implementation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ch.qos.logback.classic.encoder.PatternLayoutEncoder&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ch.qos.logback.classic.spi.ILoggingEvent&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Matcher&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Pattern&lt;/span&gt;;

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Custom Logback encoder that masks sensitive data in log messages
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveMaskingEncoder&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; PatternLayoutEncoder {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Pattern PASSWORD_PATTERN = 
        Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;compile&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;(password|pwd|pass|secret|token|key)\\s*[:=]\\s*([^\\s,}\\]]+)&amp;#34;&lt;/span&gt;, 
            Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;CASE_INSENSITIVE&lt;/span&gt;);
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;encode&lt;/span&gt;(ILoggingEvent event) {
        String message = layout.&lt;span style=&#34;color:#bbb&#34;&gt;doLayout&lt;/span&gt;(event);
        String maskedMessage = maskSensitiveData(message);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; maskedMessage.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;maskSensitiveData&lt;/span&gt;(String message) {
        Matcher matcher = PASSWORD_PATTERN.&lt;span style=&#34;color:#bbb&#34;&gt;matcher&lt;/span&gt;(message);
        StringBuffer sb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; StringBuffer();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (matcher.&lt;span style=&#34;color:#bbb&#34;&gt;find&lt;/span&gt;()) {
            matcher.&lt;span style=&#34;color:#bbb&#34;&gt;appendReplacement&lt;/span&gt;(sb, matcher.&lt;span style=&#34;color:#bbb&#34;&gt;group&lt;/span&gt;(1) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;=****&amp;#34;&lt;/span&gt;);
        }
        matcher.&lt;span style=&#34;color:#bbb&#34;&gt;appendTail&lt;/span&gt;(sb);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; sb.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This encoder sits in your logging pipeline and uses regex to catch patterns like &lt;code&gt;password=something&lt;/code&gt; or &lt;code&gt;token: xyz&lt;/code&gt;. Not perfect, but it&amp;rsquo;s saved me more than once from my own stupidity.&lt;/p&gt;
&lt;p&gt;The regex &lt;code&gt;(password|pwd|pass|secret|token|key)\\s*[:=]\\s*([^\\s,}]+)&lt;/code&gt; is probably my favorite line of code in this whole project. It&amp;rsquo;s like a little security guard that never sleeps.&lt;/p&gt;
&lt;h2 id=&#34;step-6-seeing-it-in-action&#34;&gt;Step 6: Seeing It in Action&lt;/h2&gt;
&lt;p&gt;Okay, enough theory. Let&amp;rsquo;s write some actual code that uses this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.service&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security.Sensitive&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security.SensitiveDataMasker&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.Logger&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.LoggerFactory&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.springframework.stereotype.Service&lt;/span&gt;;

&lt;span style=&#34;color:#ffa500&#34;&gt;@Service&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;AuthenticationService&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(AuthenticationService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Login method with sensitive parameter
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;login&lt;/span&gt;(String username, &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt; String password) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Even if we accidentally log the password, it will be masked
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Login attempt for user: {}&amp;#34;&lt;/span&gt;, username);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate authentication
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; authenticated = authenticateUser(username, password);
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (authenticated) {
                logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;User {} successfully authenticated&amp;#34;&lt;/span&gt;, username);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                logger.&lt;span style=&#34;color:#bbb&#34;&gt;warn&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Authentication failed for user {}&amp;#34;&lt;/span&gt;, username);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The stack trace won&amp;#39;t show the actual password!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            logger.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Authentication error&amp;#34;&lt;/span&gt;, e);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; e;
        }
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Process payment with sensitive credit card info
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(
            String username,
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt;(showPartial = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, partialLength = 4) String creditCard,
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt; String cvv) {
        
        logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Processing payment for user: {}&amp;#34;&lt;/span&gt;, username);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// creditCard will show as &amp;#34;****1234&amp;#34; if the card number is &amp;#34;1234567890121234&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// cvv will show as &amp;#34;****&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Process payment logic here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;authenticateUser&lt;/span&gt;(String username, String password) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Actual authentication logic
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(username) &amp;amp;&amp;amp; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;secret123&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(password);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And here&amp;rsquo;s a User entity with sensitive fields:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.model&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security.Sensitive&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security.SensitiveDataMasker&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;User&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String username;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String password;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String apiKey;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String email;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Sensitive&lt;/span&gt;(showPartial = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, partialLength = 4)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String phoneNumber;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;User&lt;/span&gt;(String username, String password, String apiKey, 
                String email, String phoneNumber) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;username&lt;/span&gt; = username;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;password&lt;/span&gt; = password;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;apiKey&lt;/span&gt; = apiKey;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;email&lt;/span&gt; = email;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phoneNumber&lt;/span&gt; = phoneNumber;
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Getters and setters...
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;toString&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Use our masking utility instead of default toString
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;toMaskedString&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the thing about that User class - the &lt;code&gt;toString()&lt;/code&gt; method is where most leaks happen in my experience. Someone logs a user object for debugging, and bam, all the sensitive data is right there in plain text.&lt;/p&gt;
&lt;p&gt;By overriding it with our &lt;code&gt;toMaskedString()&lt;/code&gt; utility, we&amp;rsquo;re making the safe thing the default thing. And that&amp;rsquo;s really the whole point of this exercise.&lt;/p&gt;
&lt;h2 id=&#34;does-it-actually-work-testing-time&#34;&gt;Does It Actually Work? (Testing Time)&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m not gonna lie - I was nervous when I first ran these tests. Like, &amp;ldquo;please work, please work&amp;rdquo; nervous.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.security&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.model.User&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.service.AuthenticationService&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.api.Test&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.Logger&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.LoggerFactory&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import static&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.api.Assertions.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SensitiveDataTest&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(SensitiveDataTest.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testUserToString_shouldMaskSensitiveFields&lt;/span&gt;() {
        User user = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; User(
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;johndoe&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;superSecret123!&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;api_key_1234567890abcdef&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;john@example.com&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;1234567890&amp;#34;&lt;/span&gt;
        );
        
        String userString = user.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Verify password is masked
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        assertFalse(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;superSecret123!&amp;#34;&lt;/span&gt;));
        assertTrue(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;));
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Verify API key is masked
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        assertFalse(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;api_key_1234567890abcdef&amp;#34;&lt;/span&gt;));
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Verify phone shows last 4 digits
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        assertTrue(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;7890&amp;#34;&lt;/span&gt;));
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Verify non-sensitive fields are visible
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        assertTrue(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;johndoe&amp;#34;&lt;/span&gt;));
        assertTrue(userString.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;john@example.com&amp;#34;&lt;/span&gt;));
        
        logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;User details: {}&amp;#34;&lt;/span&gt;, user);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Log output: User details: User{username=johndoe, password=****, 
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//             apiKey=****, email=john@example.com, phoneNumber=****7890}
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testLogin_shouldMaskPasswordInLogs&lt;/span&gt;() {
        AuthenticationService authService = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AuthenticationService();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This will log without exposing the password
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; result = authService.&lt;span style=&#34;color:#bbb&#34;&gt;login&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;secret123&amp;#34;&lt;/span&gt;);
        
        assertTrue(result);
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testParameterMasking&lt;/span&gt;() {
        String original = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;myPassword123&amp;#34;&lt;/span&gt;;
        Sensitive annotation = createAnnotation(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;, 4);
        
        String masked = SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;mask&lt;/span&gt;(original, annotation);
        
        assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;, masked);
        assertNotEquals(original, masked);
    }
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testPartialMasking&lt;/span&gt;() {
        String creditCard = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;1234567890123456&amp;#34;&lt;/span&gt;;
        Sensitive annotation = createAnnotation(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****&amp;#34;&lt;/span&gt;, 4);
        
        String masked = SensitiveDataMasker.&lt;span style=&#34;color:#bbb&#34;&gt;mask&lt;/span&gt;(creditCard, annotation);
        
        assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;****3456&amp;#34;&lt;/span&gt;, masked);
        assertTrue(masked.&lt;span style=&#34;color:#bbb&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;3456&amp;#34;&lt;/span&gt;));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Sensitive &lt;span style=&#34;color:#447fcf&#34;&gt;createAnnotation&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; showPartial, String mask, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; partialLength) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Sensitive() {
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Class&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; java.&lt;span style=&#34;color:#bbb&#34;&gt;lang&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;annotation&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;Annotation&lt;/span&gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;annotationType&lt;/span&gt;() {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Sensitive.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;;
            }
            
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;mask&lt;/span&gt;() {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; mask;
            }
            
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;showPartial&lt;/span&gt;() {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; showPartial;
            }
            
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;partialLength&lt;/span&gt;() {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; partialLength;
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That &lt;code&gt;createAnnotation()&lt;/code&gt; helper is a bit ugly, I&amp;rsquo;ll admit. You can&amp;rsquo;t just &lt;code&gt;new&lt;/code&gt; an annotation in Java (trust me, I tried). So you have to create an anonymous class that implements the annotation interface. It works, but it feels like you&amp;rsquo;re fighting the language a bit.&lt;/p&gt;
&lt;p&gt;Whatever. Tests pass. Green checkmarks. Dopamine hit.&lt;/p&gt;
&lt;h2 id=&#34;what-we-built-the-good-stuff&#34;&gt;What We Built (The Good Stuff)&lt;/h2&gt;
&lt;p&gt;So after all that code, what did we actually achieve? Here&amp;rsquo;s the rundown:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic parameter masking&lt;/strong&gt; in logs via AOP. Just add the annotation, and you&amp;rsquo;re protected.&lt;br&gt;
&lt;strong&gt;Stack trace protection&lt;/strong&gt; through custom exception handling. No more passwords in error reports.&lt;br&gt;
&lt;strong&gt;Flexible masking options&lt;/strong&gt;. Full mask or show partial data, your choice.&lt;br&gt;
&lt;strong&gt;Framework integration&lt;/strong&gt; with Spring and Logback. Works with what you&amp;rsquo;re probably already using.&lt;br&gt;
&lt;strong&gt;ToString safety&lt;/strong&gt; for sensitive entities. Override once, safe forever.&lt;br&gt;
&lt;strong&gt;Zero-impact on business logic&lt;/strong&gt;. Seriously, just add &lt;code&gt;@Sensitive&lt;/code&gt; and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;Not bad for a day&amp;rsquo;s work, if I say so myself.&lt;/p&gt;
&lt;h2 id=&#34;the-real-world-impact-why-this-matters&#34;&gt;The Real-World Impact (Why This Matters)&lt;/h2&gt;
&lt;p&gt;Let me paint you a picture. It&amp;rsquo;s 3 AM. Production&amp;rsquo;s on fire. You&amp;rsquo;re digging through logs trying to figure out why authentication is failing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Without @Sensitive:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ERROR - Authentication failed for user: admin with password: superSecret123!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Congrats, you just found the bug. Also congrats, you now have to file a security incident report because that password is logged in 47 different places and backed up to S3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With @Sensitive:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ERROR - Authentication failed for user: admin with password: ****
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You still found the bug (it&amp;rsquo;s in the authentication logic, not the password itself). But now you can sleep at night.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the difference. Not between working code and broken code. Between a debugging session and a career-limiting move.&lt;/p&gt;
&lt;h2 id=&#34;performance-the-question-everyone-asks&#34;&gt;Performance (The Question Everyone Asks)&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;This sounds expensive!&amp;rdquo; Yeah, I thought that too. Let&amp;rsquo;s talk numbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AOP Overhead?&lt;/strong&gt; Minimal. We&amp;rsquo;re only intercepting methods with &lt;code&gt;@Sensitive&lt;/code&gt; parameters, not every method in your app. And AspectJ is fast - like, really fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reflection?&lt;/strong&gt; Sure, we use it. But only when something&amp;rsquo;s actually being logged, which isn&amp;rsquo;t happening millions of times per second. If your app is logging that much, you&amp;rsquo;ve got bigger problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;String Operations?&lt;/strong&gt; Only happens during logging or exceptions. Again, not a hot path.&lt;/p&gt;
&lt;p&gt;I ran benchmarks. The overhead is typically less than 1ms per intercepted method call. Your database query takes 50ms. Your HTTP request takes 200ms. This? Barely registers.&lt;/p&gt;
&lt;p&gt;Is it free? No. Is it worth it? Absolutely.&lt;/p&gt;
&lt;h2 id=&#34;the-honest-limitations-because-nothings-perfect&#34;&gt;The Honest Limitations (Because Nothing&amp;rsquo;s Perfect)&lt;/h2&gt;
&lt;p&gt;Look, I&amp;rsquo;m not gonna pretend this solves everything. It doesn&amp;rsquo;t. Here&amp;rsquo;s what it can&amp;rsquo;t do:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heap dumps&lt;/strong&gt; will still show your passwords sitting in memory. If someone gets a heap dump, you&amp;rsquo;re already having a bad day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debugger access&lt;/strong&gt; means developers can still see raw values when debugging. Which is fine - they&amp;rsquo;re supposed to be able to debug. Just don&amp;rsquo;t debug in production. (You&amp;rsquo;re not debugging in production, right? Right?)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Serialization&lt;/strong&gt; isn&amp;rsquo;t handled. Standard Java serialization will serialize the raw values. You&amp;rsquo;d need custom serializers for that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JVM native methods&lt;/strong&gt; and deep JVM internals bypass our aspects. We&amp;rsquo;re working at the application layer, not the JVM layer.&lt;/p&gt;
&lt;p&gt;Could we fix these? Maybe. With a Java Agent, you could get deeper integration. With custom serializers, you could handle serialization. With memory encryption&amp;hellip; okay, now we&amp;rsquo;re getting into tinfoil hat territory.&lt;/p&gt;
&lt;p&gt;The point is: this isn&amp;rsquo;t a silver bullet. It&amp;rsquo;s a really good first line of defense. And sometimes, that&amp;rsquo;s exactly what you need.&lt;/p&gt;
&lt;h2 id=&#34;what-i-learned-building-this&#34;&gt;What I Learned Building This&lt;/h2&gt;
&lt;p&gt;You know what&amp;rsquo;s funny? I started this thinking it&amp;rsquo;d be a quick afternoon project. &amp;ldquo;Just intercept some method calls, mask some strings, how hard could it be?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Four hours later, I&amp;rsquo;m deep in the Logback source code trying to figure out why my encoder isn&amp;rsquo;t firing. Turns out I&amp;rsquo;d misconfigured the appender. Classic.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s what I actually learned:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security is messy.&lt;/strong&gt; There&amp;rsquo;s no clean solution that handles everything. You layer defenses and hope you caught the important stuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Developer experience matters more than I thought.&lt;/strong&gt; If the annotation is hard to use, people won&amp;rsquo;t use it. Simple as that. So we made it stupid simple - just add &lt;code&gt;@Sensitive&lt;/code&gt; and it works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integration beats innovation.&lt;/strong&gt; I could&amp;rsquo;ve built something totally custom that requires a special framework. Or I could make it work with Spring and Logback that everyone already uses. Guess which one people will actually adopt?&lt;/p&gt;
&lt;h2 id=&#34;wrapping-up-and-whats-next&#34;&gt;Wrapping Up (And What&amp;rsquo;s Next)&lt;/h2&gt;
&lt;p&gt;So here we are. We&amp;rsquo;ve got a working &lt;code&gt;@Sensitive&lt;/code&gt; annotation that actually prevents password leaks. It&amp;rsquo;s not perfect, but it&amp;rsquo;s pretty damn good.&lt;/p&gt;
&lt;p&gt;The code&amp;rsquo;s modular. The tests pass. You can drop it into your Spring Boot app right now and it&amp;rsquo;ll just work. No weird dependencies. No configuration hell. Just protection.&lt;/p&gt;
&lt;p&gt;Is it as elegant as PHP&amp;rsquo;s native &lt;code&gt;#[SensitiveParameter]&lt;/code&gt;? Maybe not. But it&amp;rsquo;s more flexible, and it works with the Java ecosystem we already have. I&amp;rsquo;ll take &amp;ldquo;works today&amp;rdquo; over &amp;ldquo;perfectly elegant&amp;rdquo; any day.&lt;/p&gt;
&lt;p&gt;Tomorrow, we&amp;rsquo;ll explore how to extend this with custom annotation processors that validate sensitive data handling at compile time. But that&amp;rsquo;s a story for Day 94!&lt;/p&gt;
&lt;h2 id=&#34;try-it-yourself&#34;&gt;Try It Yourself&lt;/h2&gt;
&lt;p&gt;Copy the codes from here and start your own experiments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;@Sensitive&lt;/code&gt; to different parameter types&lt;/li&gt;
&lt;li&gt;Test with various logging frameworks&lt;/li&gt;
&lt;li&gt;Try the partial masking with credit cards&lt;/li&gt;
&lt;li&gt;Create custom mask patterns&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Remember: Security isn&amp;rsquo;t just about preventing attacks, it&amp;rsquo;s about protecting your users&#39; trust. And sometimes, that starts with a simple annotation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Happy (and secure) coding.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;references-and-further-reading&#34;&gt;References and Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.oracle.com/javase/tutorial/reflect/&#34;&gt;Java Reflection API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.eclipse.org/aspectj/docs.php&#34;&gt;AspectJ Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://logback.qos.ch/manual/layouts.html&#34;&gt;Logback Custom Layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.php.net/rfc/sensitive_parameter&#34;&gt;PHP #[SensitiveParameter] RFC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html&#34;&gt;OWASP Logging Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Day 92: Building AI Agents with Java 21 and Spring AI - My Learning from the Workshop</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day92/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day92/</id>
    <published>2025-09-10T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Building Production-Ready AI Agents with Spring AI - From Chat Interfaces to Sophisticated RAG Systems</summary>
    <content type="html">&lt;h3 id=&#34;building-production-ready-ai-agents-with-spring-ai-my-learning-from-the-workshop&#34;&gt;Building Production-Ready AI Agents with Spring AI: My learning from the workshop&lt;/h3&gt;
&lt;p&gt;Hey fellow Java developers, Today marks day 92 of my #100DaysOfJava journey, I have an exciting story to share with you! I recently attended an incredible workshop on &lt;a href=&#34;https://aws-experience.com/emea/smb/e/90912/building-java-ai-agents-with-spring-ai&#34;&gt;Building Java AI Agents with Spring AI&lt;/a&gt; hosted by AWS. In this workshop I learned about building an AI agent that can not only chat with you but also manage a fictional unicorn rental business as example application.&lt;/p&gt;
&lt;h4 id=&#34;what-you-will-learn&#34;&gt;What you will learn&lt;/h4&gt;
&lt;p&gt;This article will demonstrate my learnings from the workshop, like how to construct a complete AI agent system using Spring AI, progressing from a simple chat interface to a sophisticated application featuring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Persistent Memory Management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External Tool Integration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatClient Interface&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector Store Integration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Bedrock Integration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production Deployment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security &amp;amp; Performance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-world Architecture&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll build a fictional unicorn rental system that showcases real-world AI integration patterns applicable to any business domain.&lt;/p&gt;
&lt;p&gt;Picture this: You&amp;rsquo;re a Java developer who has been comfortable with Spring Boot for years, and suddenly someone tells you that you can now build AI-powered applications using the same familiar Spring concepts you already know and love. That&amp;rsquo;s exactly what Spring AI brings to the table!&lt;/p&gt;
&lt;h3 id=&#34;understanding-spring-ais-core-architecture&#34;&gt;Understanding Spring AI&amp;rsquo;s Core Architecture&lt;/h3&gt;
&lt;p&gt;Spring AI provides a unified abstraction layer over various AI model providers, including OpenAI, Azure OpenAI, and Amazon Bedrock. The framework&amp;rsquo;s central component is the &lt;code&gt;ChatClient&lt;/code&gt; interface, which standardizes interactions with different AI models while maintaining Spring&amp;rsquo;s dependency injection and configuration principles.&lt;/p&gt;
&lt;p&gt;To fully grasp Spring AI&amp;rsquo;s architecture, it&amp;rsquo;s essential to understand its foundational concepts. The &lt;a href=&#34;https://docs.spring.io/spring-ai/reference/concepts.html&#34;&gt;Spring AI Core Concepts&lt;/a&gt; documentation provides comprehensive coverage of these fundamental principles.&lt;/p&gt;
&lt;h3 id=&#34;the-chatclient-interface-your-gateway-to-ai-magic&#34;&gt;The ChatClient Interface: Your Gateway to AI Magic&lt;/h3&gt;
&lt;p&gt;At the heart of Spring AI lies the &lt;code&gt;ChatClient&lt;/code&gt; interface - think of it as your personal assistant that can talk to any AI model. Here&amp;rsquo;s what makes it so powerful:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@RestController&lt;/span&gt;
&lt;span style=&#34;color:#ffa500&#34;&gt;@RequestMapping&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;api&amp;#34;&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ChatController&lt;/span&gt; {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String DEFAULT_SYSTEM_PROMPT = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;        You are a helpful AI assistant for Unicorn Rentals, a fictional company that rents unicorns.
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;        Be friendly, helpful, and concise in your responses.
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ChatClient chatClient;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ChatController&lt;/span&gt;(ChatClient.&lt;span style=&#34;color:#bbb&#34;&gt;Builder&lt;/span&gt; chatClientBuilder) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;chatClient&lt;/span&gt; = chatClientBuilder
            .&lt;span style=&#34;color:#bbb&#34;&gt;defaultSystem&lt;/span&gt;(DEFAULT_SYSTEM_PROMPT)
            .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It can use any model under the hood with system prompt and other configuration. This abstraction enables switching between AI providers without modifying application logic, similar to how Spring Data abstracts database interactions.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@PostMapping&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/chat/stream&amp;#34;&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Flux&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;chatStream&lt;/span&gt;(&lt;span style=&#34;color:#ffa500&#34;&gt;@RequestBody&lt;/span&gt; PromptRequest promptRequest){
    var conversationId = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;user1&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This should be retrieved from the Auth context
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; chatClient.&lt;span style=&#34;color:#bbb&#34;&gt;prompt&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;user&lt;/span&gt;(promptRequest.&lt;span style=&#34;color:#bbb&#34;&gt;prompt&lt;/span&gt;())
        .&lt;span style=&#34;color:#bbb&#34;&gt;advisors&lt;/span&gt;(advisor -&amp;gt; advisor.&lt;span style=&#34;color:#bbb&#34;&gt;param&lt;/span&gt;(ChatMemory.&lt;span style=&#34;color:#bbb&#34;&gt;CONVERSATION_ID&lt;/span&gt;, conversationId))
        .&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;content&lt;/span&gt;();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The streaming endpoint returns a &lt;code&gt;Flux&amp;lt;String&amp;gt;&lt;/code&gt;, which means the frontend receives the AI response word by word, creating that magical typewriter effect!&lt;/p&gt;
&lt;h4 id=&#34;step-2-giving-our-agent-memory&#34;&gt;Step 2: Giving Our Agent Memory&lt;/h4&gt;
&lt;p&gt;What good is a rental agent who forgets who you are the moment you ask a second question? This is where &lt;code&gt;MessageChatMemoryAdvisor&lt;/code&gt; comes to the rescue. As LLM doesnt have persistent memory between each call, if we dont manage memory ourselves we wont remember important information in our chats. Furthermore, assistant wont be able to give accurate and helpful answers without memory&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ChatController&lt;/span&gt;(ChatClient.&lt;span style=&#34;color:#bbb&#34;&gt;Builder&lt;/span&gt; chatClient, DataSource dataSource, 
                     VectorStore vectorStore, ToolCallbackProvider tools) {
    var chatMemoryRepository = JdbcChatMemoryRepository.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;()
        .&lt;span style=&#34;color:#bbb&#34;&gt;dataSource&lt;/span&gt;(dataSource)
        .&lt;span style=&#34;color:#bbb&#34;&gt;dialect&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PostgresChatMemoryRepositoryDialect())
        .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

    var chatMemory = MessageWindowChatMemory.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;()
        .&lt;span style=&#34;color:#bbb&#34;&gt;chatMemoryRepository&lt;/span&gt;(chatMemoryRepository)
        .&lt;span style=&#34;color:#bbb&#34;&gt;maxMessages&lt;/span&gt;(20)
        .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;vectorStore&lt;/span&gt; = vectorStore;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;chatClient&lt;/span&gt; = chatClient
        .&lt;span style=&#34;color:#bbb&#34;&gt;defaultSystem&lt;/span&gt;(DEFAULT_SYSTEM_PROMPT)
        .&lt;span style=&#34;color:#bbb&#34;&gt;defaultAdvisors&lt;/span&gt;(
            MessageChatMemoryAdvisor.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;(chatMemory).&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;(),
            QuestionAnswerAdvisor.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;(vectorStore).&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;())
        .&lt;span style=&#34;color:#bbb&#34;&gt;defaultTools&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DateTimeTools(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; WeatherTools())
        .&lt;span style=&#34;color:#bbb&#34;&gt;defaultToolCallbacks&lt;/span&gt;(tools)
        .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;MessageWindowChatMemory&lt;/code&gt; maintains a sliding window of recent messages, while &lt;code&gt;JdbcChatMemoryRepository&lt;/code&gt; provides persistence using standard database infrastructure.&lt;/p&gt;
&lt;h4 id=&#34;streaming-responses-for-enhanced-user-experience&#34;&gt;Streaming Responses for Enhanced User Experience&lt;/h4&gt;
&lt;p&gt;Modern AI applications benefit from streaming responses that provide immediate feedback:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@PostMapping&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/chat/stream&amp;#34;&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Flux&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;chatStream&lt;/span&gt;(&lt;span style=&#34;color:#ffa500&#34;&gt;@RequestBody&lt;/span&gt; PromptRequest promptRequest){
    var conversationId = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;user1&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Should be retrieved from authentication context
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; chatClient.&lt;span style=&#34;color:#bbb&#34;&gt;prompt&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;user&lt;/span&gt;(promptRequest.&lt;span style=&#34;color:#bbb&#34;&gt;prompt&lt;/span&gt;())
        .&lt;span style=&#34;color:#bbb&#34;&gt;advisors&lt;/span&gt;(advisor -&amp;gt; advisor.&lt;span style=&#34;color:#bbb&#34;&gt;param&lt;/span&gt;(ChatMemory.&lt;span style=&#34;color:#bbb&#34;&gt;CONVERSATION_ID&lt;/span&gt;, conversationId))
        .&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;content&lt;/span&gt;();
}

record &lt;span style=&#34;color:#447fcf&#34;&gt;PromptRequest&lt;/span&gt;(String prompt) {}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;Flux&amp;lt;String&amp;gt;&lt;/code&gt; return type enables real-time streaming of AI responses, improving perceived performance and user engagement.&lt;/p&gt;
&lt;h3 id=&#34;web-interface&#34;&gt;Web Interface&lt;/h3&gt;
&lt;p&gt;The web interface features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time streaming responses&lt;/strong&gt; - Watch as the AI types responses in real-time!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark mode design&lt;/strong&gt; - Perfect for developers who love dark themes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive layout&lt;/strong&gt; - Works beautifully on desktop and mobile&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat history&lt;/strong&gt; - See your entire conversation flow&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;implementing-retrieval-augmented-generation-rag&#34;&gt;Implementing Retrieval-Augmented Generation (RAG)&lt;/h3&gt;
&lt;p&gt;RAG enhances AI responses by incorporating domain-specific knowledge from external sources. This approach combines the general knowledge of pre-trained models with current, specific information from your organization&amp;rsquo;s data.&lt;/p&gt;
&lt;h4 id=&#34;vector-store-integration&#34;&gt;Vector Store Integration&lt;/h4&gt;
&lt;p&gt;Spring AI integrates seamlessly with PostgreSQL&amp;rsquo;s PGVector extension for vector similarity search:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@PostMapping&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;load&amp;#34;&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;loadDataToVectorStore&lt;/span&gt;(&lt;span style=&#34;color:#ffa500&#34;&gt;@RequestBody&lt;/span&gt; String content) {
    vectorStore.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Document(content)));
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The RAG workflow operates as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Documents are chunked and converted to vector embeddings using Amazon Titan&lt;/li&gt;
&lt;li&gt;User queries are similarly embedded&lt;/li&gt;
&lt;li&gt;Vector similarity search retrieves relevant document chunks&lt;/li&gt;
&lt;li&gt;The AI model generates responses using both its training data and retrieved context&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;configuration-for-rag&#34;&gt;Configuration for RAG&lt;/h4&gt;
&lt;p&gt;The application properties configure the complete RAG pipeline:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;# RAG Configuration
spring.ai.model.embedding=bedrock-titan
spring.ai.bedrock.titan.embedding.model=amazon.titan-embed-text-v2:0
spring.ai.bedrock.titan.embedding.input-type=text
spring.ai.vectorstore.pgvector.initialize-schema=true
spring.ai.vectorstore.pgvector.dimensions=1024
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This configuration automatically initializes the vector database schema and configures Amazon Titan for generating embeddings.&lt;/p&gt;
&lt;h3 id=&#34;tool-calling-extending-ai-capabilities&#34;&gt;Tool Calling: Extending AI Capabilities&lt;/h3&gt;
&lt;p&gt;Tool calling allows AI agents to interact with external systems and APIs, transforming them from simple chatbots into capable automation systems.&lt;/p&gt;
&lt;h4 id=&#34;implementing-external-tools&#34;&gt;Implementing External Tools&lt;/h4&gt;
&lt;p&gt;Tools are defined using the &lt;code&gt;@Tool&lt;/code&gt; annotation and standard Java methods:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;WeatherTools&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; RestTemplate restTemplate = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RestTemplate();

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Tool&lt;/span&gt;(description = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Get weather forecast for a city on a specific date (format: YYYY-MM-DD)&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getWeather&lt;/span&gt;(String city, String date) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Convert city to coordinates using Geocoding API
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            var encodedCity = UriUtils.&lt;span style=&#34;color:#bbb&#34;&gt;encode&lt;/span&gt;(city, StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);
            var geocodingUrl = URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://geocoding-api.open-meteo.com/v1/search?name=&amp;#34;&lt;/span&gt; +
                                         encodedCity + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;amp;count=1&amp;#34;&lt;/span&gt;);

            var geocodingResponse = restTemplate.&lt;span style=&#34;color:#bbb&#34;&gt;exchange&lt;/span&gt;(
                geocodingUrl,
                HttpMethod.&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;,
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;,
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ParameterizedTypeReference&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;() {}
            );

            var body = geocodingResponse.&lt;span style=&#34;color:#bbb&#34;&gt;getBody&lt;/span&gt;();
            var results = (body != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) ? (List&amp;lt;?&amp;gt;) body.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;results&amp;#34;&lt;/span&gt;, Collections.&lt;span style=&#34;color:#bbb&#34;&gt;emptyList&lt;/span&gt;()) : Collections.&lt;span style=&#34;color:#bbb&#34;&gt;emptyList&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (results.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;City not found: &amp;#34;&lt;/span&gt; + city;
            }

            var location = (Map&amp;lt;?, ?&amp;gt;) results.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(0);
            var latitude = ((Number) location.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;latitude&amp;#34;&lt;/span&gt;)).&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;();
            var longitude = ((Number) location.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;longitude&amp;#34;&lt;/span&gt;)).&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;();
            var cityName = (String) location.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Get weather data from Open-Meteo API
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            var weatherUrl = URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.open-meteo.com/v1/forecast&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;?latitude=%s&amp;amp;longitude=%s&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;formatted&lt;/span&gt;(latitude, longitude) +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;amp;daily=temperature_2m_max,temperature_2m_min&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;amp;timezone=auto&amp;#34;&lt;/span&gt; +
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;amp;start_date=%s&amp;amp;end_date=%s&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;formatted&lt;/span&gt;(date, date)
            );

            var weatherResponse = restTemplate.&lt;span style=&#34;color:#bbb&#34;&gt;exchange&lt;/span&gt;(
                weatherUrl,
                HttpMethod.&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;,
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;,
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ParameterizedTypeReference&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;() {}
            );

            var weatherData = weatherResponse.&lt;span style=&#34;color:#bbb&#34;&gt;getBody&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (weatherData == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to retrieve weather data&amp;#34;&lt;/span&gt;;
            }

            var dailyData = (Map&amp;lt;?, ?&amp;gt;) weatherData.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;daily&amp;#34;&lt;/span&gt;);
            var dailyUnits = (Map&amp;lt;?, ?&amp;gt;) weatherData.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;daily_units&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (dailyData == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || dailyUnits == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Weather data format is invalid&amp;#34;&lt;/span&gt;;
            }

            var maxTempList = (List&amp;lt;?&amp;gt;) dailyData.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;temperature_2m_max&amp;#34;&lt;/span&gt;);
            var minTempList = (List&amp;lt;?&amp;gt;) dailyData.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;temperature_2m_min&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (maxTempList == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || minTempList == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; || maxTempList.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;() || minTempList.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Temperature data not available for the specified date&amp;#34;&lt;/span&gt;;
            }

            var maxTemp = ((Number) maxTempList.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(0)).&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;();
            var minTemp = ((Number) minTempList.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(0)).&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;();
            var unit = (String) dailyUnits.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;temperature_2m_max&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                   Weather for %s on %s:
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                   Min: %.1f%s, Max: %.1f%s
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                   &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;formatted&lt;/span&gt;(cityName, date, minTemp, unit, maxTemp, unit);

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error fetching weather data: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;datetime-tool-for-temporal-context&#34;&gt;DateTime Tool for Temporal Context&lt;/h4&gt;
&lt;p&gt;A simpler tool demonstrates basic temporal functionality:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DateTimeTools&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Tool&lt;/span&gt;(description = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Get the current date and time&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getCurrentDateTime&lt;/span&gt;(String timeZone) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; java.&lt;span style=&#34;color:#bbb&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ZonedDateTime&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;(java.&lt;span style=&#34;color:#bbb&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ZoneId&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(timeZone))
                .&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(DateTimeFormatter.&lt;span style=&#34;color:#bbb&#34;&gt;ISO_LOCAL_DATE_TIME&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When users request weather information, the AI automatically determines it needs current time context and weather data, orchestrating multiple tool calls to provide comprehensive responses.&lt;/p&gt;
&lt;h3 id=&#34;model-context-protocol-mcp-integration&#34;&gt;Model Context Protocol (MCP) Integration&lt;/h3&gt;
&lt;p&gt;MCP standardizes communication between AI agents and external services. This protocol enables AI agents to interact with existing business systems without custom integration code.&lt;/p&gt;
&lt;h4 id=&#34;converting-existing-services-to-mcp-servers&#34;&gt;Converting Existing Services to MCP Servers&lt;/h4&gt;
&lt;p&gt;Existing Spring Boot services can be enhanced with MCP capabilities by adding the &lt;code&gt;@Tool&lt;/code&gt; annotation to service methods:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Service&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;UnicornService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; UnicornRepository unicornRepository;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; UnicornPublisher unicornPublisher;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(UnicornService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Tool&lt;/span&gt;(description = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Create a new unicorn in the unicorn store.&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Transactional&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Unicorn &lt;span style=&#34;color:#447fcf&#34;&gt;createUnicorn&lt;/span&gt;(Unicorn unicorn) {
        logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Creating unicorn: {}&amp;#34;&lt;/span&gt;, unicorn);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (unicorn.&lt;span style=&#34;color:#bbb&#34;&gt;getId&lt;/span&gt;() == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            unicorn.&lt;span style=&#34;color:#bbb&#34;&gt;setId&lt;/span&gt;(UUID.&lt;span style=&#34;color:#bbb&#34;&gt;randomUUID&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
        }
        validateUnicorn(unicorn);

        var savedUnicorn = unicornRepository.&lt;span style=&#34;color:#bbb&#34;&gt;save&lt;/span&gt;(unicorn);
        publishUnicornEvent(savedUnicorn, UnicornEventType.&lt;span style=&#34;color:#bbb&#34;&gt;UNICORN_CREATED&lt;/span&gt;);

        logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Created unicorn with ID: {}&amp;#34;&lt;/span&gt;, savedUnicorn.&lt;span style=&#34;color:#bbb&#34;&gt;getId&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; savedUnicorn;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Tool&lt;/span&gt;(description = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Get a list of all unicorns in the unicorn store&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; List&amp;lt;Unicorn&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getAllUnicorns&lt;/span&gt;(String... parameters) {
        logger.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Retrieving all unicorns&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport
                .&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(unicornRepository.&lt;span style=&#34;color:#bbb&#34;&gt;findAll&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This approach allows AI agents to perform actual business operations, transforming them from conversational interfaces into functional business automation tools.&lt;/p&gt;
&lt;h3 id=&#34;configuration-driven-development&#34;&gt;Configuration-Driven Development&lt;/h3&gt;
&lt;p&gt;Spring AI&amp;rsquo;s configuration-centric approach minimizes boilerplate code:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;# Application basics
spring.application.name=agent
logging.level.org.springframework.ai=DEBUG

# Amazon Bedrock Configuration
spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-3-7-sonnet-20250219-v1:0

# UI Configuration
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

# JDBC Memory Configuration
spring.ai.chat.memory.repository.jdbc.initialize-schema=always
spring.datasource.username=postgres

# RAG Configuration
spring.ai.model.embedding=bedrock-titan
spring.ai.bedrock.titan.embedding.model=amazon.titan-embed-text-v2:0
spring.ai.bedrock.titan.embedding.input-type=text
spring.ai.vectorstore.pgvector.initialize-schema=true
spring.ai.vectorstore.pgvector.dimensions=1024

# MCP Client Configuration
spring.ai.mcp.client.toolcallback.enabled=true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This configuration automatically sets up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude 3.5 Sonnet&lt;/strong&gt; as our chat model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon Titan&lt;/strong&gt; for embeddings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; for memory and vector storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thymeleaf&lt;/strong&gt; for web templates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP client&lt;/strong&gt; for external tool integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No manual beans, no complex configuration classes - just properties!&lt;/p&gt;
&lt;h3 id=&#34;the-complete-architecture-a-symphony-of-components&#34;&gt;The Complete Architecture: A Symphony of Components&lt;/h3&gt;
&lt;p&gt;Our final unicorn rental agent was a masterpiece of modern software architecture:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ChatClient&lt;/strong&gt; - The conductor orchestrating everything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Interface&lt;/strong&gt; - Beautiful Thymeleaf + Tailwind CSS frontend with real-time streaming&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory System&lt;/strong&gt; - Both local and persistent, keeping track of conversations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector Store&lt;/strong&gt; - RAG capabilities for domain knowledge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Calling&lt;/strong&gt; - Weather, datetime, and business operations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Integration&lt;/strong&gt; - Communication with external services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Bedrock&lt;/strong&gt; - Powerful Claude AI models and Titan embeddings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL + PGVector&lt;/strong&gt; - Reliable data storage with vector capabilities&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The beauty of this architecture is how all these components work together seamlessly, yet each can be developed and tested independently.&lt;/p&gt;
&lt;h3 id=&#34;deployment-taking-it-to-the-cloud&#34;&gt;Deployment: Taking It to the Cloud&lt;/h3&gt;
&lt;p&gt;The workshop didn&amp;rsquo;t stop at development - we deployed our creation to AWS EKS (Elastic Kubernetes Service)! Using Jib for containerization and Kubernetes manifests, our unicorn rental agent went from local development to cloud-ready production.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Building and pushing to Amazon ECR&lt;/span&gt;
mvn compile jib:build -Dimage=&lt;span style=&#34;color:#40ffff&#34;&gt;$ECR_URI&lt;/span&gt;:latest

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Deploying to Amazon EKS&lt;/span&gt;
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;key-takeaways-for-fellow-java-developers&#34;&gt;Key Takeaways for Fellow Java Developers&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Familiar Territory&lt;/strong&gt;: Spring AI uses the same patterns we know and love from Spring Framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progressive Enhancement&lt;/strong&gt;: Start simple, add features incrementally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real Business Value&lt;/strong&gt;: AI agents can perform actual business operations, not just chat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production Ready&lt;/strong&gt;: With proper architecture, these agents can handle real-world loads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ecosystem Integration&lt;/strong&gt;: Seamlessly works with existing Spring/Java infrastructure&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;performance-and-scaling&#34;&gt;Performance and Scaling&lt;/h3&gt;
&lt;p&gt;Several factors impact production performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory Management&lt;/strong&gt;: Configure appropriate message window sizes based on conversation length requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector Store Optimization&lt;/strong&gt;: Regularly maintain vector indexes and consider partitioning strategies for large datasets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection Pooling&lt;/strong&gt;: Configure database connection pools appropriately for concurrent AI interactions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caching&lt;/strong&gt;: Implement caching strategies for frequently accessed embeddings and tool responses&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;security-considerations&#34;&gt;Security Considerations&lt;/h3&gt;
&lt;p&gt;Production deployments require attention to security:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: Integrate conversation IDs with proper user authentication systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Rate Limiting&lt;/strong&gt;: Implement rate limiting to prevent abuse of AI endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Privacy&lt;/strong&gt;: Ensure conversation data handling complies with privacy regulations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input Validation&lt;/strong&gt;: Validate and sanitize all user inputs before processing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;common-pitfalls-and-best-practices&#34;&gt;Common Pitfalls and Best Practices&lt;/h3&gt;
&lt;p&gt;When developing AI applications with Spring AI, several common pitfalls can impact performance, cost, and user experience. Here&amp;rsquo;s how to avoid them:&lt;/p&gt;
&lt;h3 id=&#34;memory-management&#34;&gt;Memory Management&lt;/h3&gt;
&lt;p&gt;Unlimited conversation history can lead to context window overflow and increased costs. Implement sliding window memory with appropriate limits:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;var chatMemory = MessageWindowChatMemory.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;()
    .&lt;span style=&#34;color:#bbb&#34;&gt;chatMemoryRepository&lt;/span&gt;(chatMemoryRepository)
    .&lt;span style=&#34;color:#bbb&#34;&gt;maxMessages&lt;/span&gt;(20) &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Adjust based on use case
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;tool-design-principles&#34;&gt;Tool Design Principles&lt;/h3&gt;
&lt;p&gt;Effective tools should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atomic&lt;/strong&gt;: Each tool should perform a single, well-defined operation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idempotent&lt;/strong&gt;: Tools should produce consistent results for identical inputs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error-Resilient&lt;/strong&gt;: Implement comprehensive error handling and fallback mechanisms&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;vector-store-maintenance&#34;&gt;Vector Store Maintenance&lt;/h3&gt;
&lt;p&gt;RAG systems require ongoing maintenance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Regular reindexing of document embeddings&lt;/li&gt;
&lt;li&gt;Monitoring for embedding drift as models evolve&lt;/li&gt;
&lt;li&gt;Implementing document versioning and update strategies&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;real-world-applications&#34;&gt;Real-World Applications&lt;/h3&gt;
&lt;p&gt;The patterns demonstrated extend to various enterprise scenarios:&lt;/p&gt;
&lt;h4 id=&#34;customer-service-automation&#34;&gt;Customer Service Automation&lt;/h4&gt;
&lt;p&gt;AI agents can handle customer inquiries by accessing knowledge bases, order systems, and external APIs for real-time information retrieval and problem resolution.&lt;/p&gt;
&lt;h4 id=&#34;internal-tool-integration&#34;&gt;Internal Tool Integration&lt;/h4&gt;
&lt;p&gt;Development teams can create AI assistants that interact with CI/CD systems, monitoring tools, and documentation platforms to streamline operational workflows.&lt;/p&gt;
&lt;h4 id=&#34;business-process-automation&#34;&gt;Business Process Automation&lt;/h4&gt;
&lt;p&gt;AI agents can orchestrate complex business processes by integrating with ERP systems, approval workflows, and notification services.&lt;/p&gt;
&lt;h3 id=&#34;conclusion-the-future-of-java-ai-development&#34;&gt;Conclusion: The Future of Java AI Development&lt;/h3&gt;
&lt;p&gt;Spring AI represents a paradigm shift for Java developers entering the AI space. Instead of learning entirely new frameworks or switching to Python, you can leverage your existing Spring expertise to build sophisticated AI applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key takeaways for your next Java AI project:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Leverage Familiar Patterns&lt;/strong&gt;: Spring AI uses dependency injection, configuration properties, and annotations you already know&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start Simple, Scale Smart&lt;/strong&gt;: Begin with basic chat functionality and progressively add memory, RAG, and tool calling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production-Ready Architecture&lt;/strong&gt;: The framework includes enterprise features like connection pooling, error handling, and monitoring out of the box&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider Flexibility&lt;/strong&gt;: Switch between OpenAI, Azure, AWS Bedrock, or other providers without changing your application code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real Business Value&lt;/strong&gt;: Move beyond chatbots to create AI agents that integrate with existing business systems&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The combination of Spring AI&amp;rsquo;s familiar development model with powerful AI capabilities opens up endless possibilities for Java applications. Whether you&amp;rsquo;re building customer service automation, internal development tools, or complex business process orchestration, Spring AI provides the foundation you need.&lt;/p&gt;
&lt;p&gt;As the AI landscape continues evolving, Spring AI ensures Java developers can innovate without abandoning their expertise. The future of enterprise AI is here, and it speaks Java.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to start building?&lt;/strong&gt; Check out the &lt;a href=&#34;https://github.com/dhrubo55/java-ai-agent-amazon-workshop&#34;&gt;complete project repository&lt;/a&gt; and begin your own AI journey today.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This post is part of my #100DaysOfJava challenge. Follow along for daily insights into Java development, Spring Framework innovations, and cutting-edge software engineering practices.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://spring.io/projects/spring-ai&#34;&gt;Spring AI Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/bedrock/&#34;&gt;AWS Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/aws-samples/java-on-aws&#34;&gt;Workshop GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://modelcontextprotocol.io/&#34;&gt;Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Day 91: The Art of Reading Massive Files Without Breaking a Sweat - Memory Mapping in Java 21</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day91/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day91/</id>
    <published>2025-08-15T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Processing giant files - Memory mapping Very Large Files in Java Without Breaking a Sweat</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;Any sufficiently advanced technology is indistinguishable from magic&amp;quot;&lt;/strong&gt; - Arthur C. Clark&lt;/p&gt;
&lt;p&gt;Today I am exploring that looked to me like a magic trick when I first saw it in a PR for &lt;a href=&#34;https://www.morling.dev/blog/1brc-results-are-in/&#34;&gt;1BRC&lt;/a&gt; challange by &lt;a href=&#34;https://www.linkedin.com/in/gunnar-morling/&#34;&gt;Gunnar Morling&lt;/a&gt; which is called Memory mapping a very large file.&lt;/p&gt;
&lt;h3 id=&#34;1-memory-mapped-files-the-magicians-trick&#34;&gt;1. Memory-Mapped Files: The Magician&amp;rsquo;s Trick&lt;/h3&gt;
&lt;p&gt;Let me talk about the first time I discovered memory-mapped files. I was looking into the pr where it was required to read a very large file with &lt;strong&gt;1 billion rows&lt;/strong&gt; of temperature data which was around a 12GB file, You will find all the details &lt;a href=&#34;https://github.com/gunnarmorling/1brc&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Memory mapping to me felt like is having a magical book that automatically opens to exactly the page you&amp;rsquo;re thinking about. But here&amp;rsquo;s where it gets fascinating, I didnt understood the magic so like a scientific explorer I started to look in depth what is happening and now I am sharing the expedition as blog post.From the deepest kernel level all the way up to your Java code.&lt;/p&gt;
&lt;h3 id=&#34;the-deep-dive-from-kernel-to-code&#34;&gt;The Deep Dive: From Kernel to Code&lt;/h3&gt;
&lt;p&gt;Now we are going to deep dive together into the whole process, where it starts from kernel and ends with creating a memory mapped file for us.&lt;/p&gt;
&lt;h4 id=&#34;step-1-the-os-kernels-virtual-memory-magic&#34;&gt;Step 1: The OS Kernel&amp;rsquo;s Virtual Memory Magic&lt;/h4&gt;
&lt;p&gt;When you call &lt;code&gt;channel.map()&lt;/code&gt; in Java, you&amp;rsquo;re actually asking the operating system to perform one of its coolest tricks. The OS kernel creates what&amp;rsquo;s called a &lt;strong&gt;virtual memory mapping&lt;/strong&gt;. Think of it like this:&lt;/p&gt;
&lt;p&gt;Your file on disk is sitting there, maybe 5GB of data. Instead of copying all that data into your program&amp;rsquo;s memory (which would blow up your heap memory), the kernel creates a clever illusion. It assigns a range of virtual memory addresses—let&amp;rsquo;s say from address 0x10000000 to 0x30000000—and says &lt;strong&gt;these addresses represent the file&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the kicker: &lt;strong&gt;no actual file data gets loaded yet&lt;/strong&gt;. The kernel just creates a mapping table that says &amp;ldquo;if anyone asks for memory at address 0x10000000, that&amp;rsquo;s actually byte 0 of the file.&amp;rdquo;&lt;/p&gt;
&lt;h4 id=&#34;step-2-the-page-fault&#34;&gt;Step 2: The Page Fault&lt;/h4&gt;
&lt;p&gt;Now comes the really clever part. When your Java code tries to read from the mapped buffer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;MappedByteBuffer buffer = channel.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;MapMode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;READ_ONLY&lt;/span&gt;, 0, fileSize);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt; firstByte = buffer.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(0); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This triggers the magic!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That &lt;code&gt;buffer.get(0)&lt;/code&gt; call tries to access virtual memory address 0x10000000. But remember, there&amp;rsquo;s no actual data there yet! This causes what&amp;rsquo;s called a &amp;ldquo;page fault&amp;rdquo;—the CPU literally stops and says &amp;ldquo;hey OS, there&amp;rsquo;s nothing at this address!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The kernel&amp;rsquo;s page fault handler springs into action:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It realizes this address is part of a file mapping&lt;/li&gt;
&lt;li&gt;It calculates which part of the file needs to be loaded (usually 4KB or 8KB chunks called &amp;ldquo;pages&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;It reads that chunk from disk into physical RAM&lt;/li&gt;
&lt;li&gt;It updates the memory mapping table to point that virtual address to the real RAM location&lt;/li&gt;
&lt;li&gt;It tells the CPU &amp;ldquo;okay, try again&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your CPU then successfully reads the byte, and your Java code continues happily, completely unaware of this elaborate mechanism that just happened.&lt;/p&gt;
&lt;h4 id=&#34;step-3-the-page-cache-optimization&#34;&gt;Step 3: The Page Cache Optimization&lt;/h4&gt;
&lt;p&gt;Here&amp;rsquo;s where things get really intriguing. The OS doesn&amp;rsquo;t just load the data and forget about it. It keeps those file chunks in what&amp;rsquo;s called the &lt;strong&gt;page cache&lt;/strong&gt;. This is shared memory that all processes on the system can use.&lt;/p&gt;
&lt;p&gt;So if another program (or even another instance of your program) tries to read the same file, the OS says &amp;ldquo;I already have that in RAM!&amp;rdquo; and reuses the same physical memory pages. This is why memory-mapped files are incredibly efficient when multiple processes need to access the same large files.&lt;/p&gt;
&lt;p&gt;Here you can get the whole idea how memory mapping is working behind the scene&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1755235621/images-from-blog/Java-Memory-Mapping_vg0yot.svg&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;the-java-layer-whats-really-happening&#34;&gt;The Java Layer: What&amp;rsquo;s Really Happening&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s look at what Java is doing on top of this OS magic:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;109
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;110
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;111
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;112
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;113
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;114
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;115
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;116
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;117
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;118
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;119
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;120
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;121
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;122
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;123
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;124
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;125
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;126
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;127
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;128
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;129
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;130
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;131
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;132
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;133
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;134
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;135
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;136
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;137
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;138
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;139
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;140
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;141
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;142
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;143
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;144
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;145
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.RandomAccessFile&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.MappedByteBuffer&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.channels.FileChannel&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.charset.StandardCharsets&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MemoryMappedReader&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processLogFile&lt;/span&gt;(String path) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (RandomAccessFile file = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RandomAccessFile(path, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;);
             FileChannel channel = file.&lt;span style=&#34;color:#bbb&#34;&gt;getChannel&lt;/span&gt;()) {

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; fileSize = channel.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;File size: &amp;#34;&lt;/span&gt; + fileSize / (1024 * 1024) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MB&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This is the critical moment - we&amp;#39;re asking the OS to create the mapping
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            MappedByteBuffer buffer = channel.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(
                FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;MapMode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;READ_ONLY&lt;/span&gt;, 
                0, 
                fileSize
            );

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Let&amp;#39;s demonstrate different access patterns to show the performance characteristics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            demonstrateRandomAccess(buffer);
            demonstrateSequentialAccess(buffer);
            demonstratePatternSearch(buffer);

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Something went wrong: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateRandomAccess&lt;/span&gt;(MappedByteBuffer buffer) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n=== Random Access Test ===&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Jump around the file randomly - this shows the power of memory mapping
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;[] positions = {0, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;() / 4, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;() / 2, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;() * 3 / 4, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;() - 1};
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; pos : positions) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (pos &amp;lt; buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;()) {
                buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;((&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;)pos);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt; b = buffer.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Byte at position &amp;#34;&lt;/span&gt; + pos + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;char&lt;/span&gt;)b);
            }
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; endTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Random access took: &amp;#34;&lt;/span&gt; + (endTime - startTime) / 1_000_000 + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Notice how fast that was? No disk seeks needed after the first few page faults!&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateSequentialAccess&lt;/span&gt;(MappedByteBuffer buffer) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n=== Sequential Access Test ===&amp;#34;&lt;/span&gt;);
        buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(0); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reset to beginning
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; lineCount = 0;
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This will trigger efficient sequential page loading
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (buffer.&lt;span style=&#34;color:#bbb&#34;&gt;hasRemaining&lt;/span&gt;() &amp;amp;&amp;amp; lineCount &amp;lt; 1000) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt; b = buffer.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (b == &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;) {
                lineCount++;
            }
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; endTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Counted &amp;#34;&lt;/span&gt; + lineCount + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; lines&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Sequential access took: &amp;#34;&lt;/span&gt; + (endTime - startTime) / 1_000_000 + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;The OS optimized this by reading ahead!&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstratePatternSearch&lt;/span&gt;(MappedByteBuffer buffer) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n=== Pattern Search Test ===&amp;#34;&lt;/span&gt;);
        buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(0); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reset to beginning
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] errorPattern = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ERROR&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;(StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; errorCount = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This shows how we can treat the entire file like a giant array
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (buffer.&lt;span style=&#34;color:#bbb&#34;&gt;hasRemaining&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (matchesPattern(buffer, errorPattern)) {
                errorCount++;
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Skip past the matched pattern to avoid double-counting
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;() + errorPattern.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;()));
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;() + 1);
            }
        }
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; endTime = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Found &amp;#34;&lt;/span&gt; + errorCount + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; errors&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Pattern search took: &amp;#34;&lt;/span&gt; + (endTime - startTime) / 1_000_000 + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ms&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;We just searched through the entire file without loading it all into heap memory!&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;matchesPattern&lt;/span&gt;(MappedByteBuffer buffer, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] pattern) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (buffer.&lt;span style=&#34;color:#bbb&#34;&gt;remaining&lt;/span&gt;() &amp;lt; pattern.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; originalPosition = buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;();
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if the pattern matches at current position
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; pattern.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (buffer.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;() != pattern[i]) {
                buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(originalPosition); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reset position
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
        }
        
        buffer.&lt;span style=&#34;color:#bbb&#34;&gt;position&lt;/span&gt;(originalPosition); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Reset position for caller
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Let&amp;#39;s also show what happens with memory monitoring
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateMemoryUsage&lt;/span&gt;(String path) {
        Runtime runtime = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; beforeMapping = runtime.&lt;span style=&#34;color:#bbb&#34;&gt;totalMemory&lt;/span&gt;() - runtime.&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Heap memory before mapping: &amp;#34;&lt;/span&gt; + beforeMapping / (1024 * 1024) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MB&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (RandomAccessFile file = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RandomAccessFile(path, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;);
             FileChannel channel = file.&lt;span style=&#34;color:#bbb&#34;&gt;getChannel&lt;/span&gt;()) {

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; fileSize = channel.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;();
            MappedByteBuffer buffer = channel.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;MapMode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;READ_ONLY&lt;/span&gt;, 0, fileSize);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; afterMapping = runtime.&lt;span style=&#34;color:#bbb&#34;&gt;totalMemory&lt;/span&gt;() - runtime.&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Heap memory after mapping &amp;#34;&lt;/span&gt; + fileSize / (1024 * 1024) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MB file: &amp;#34;&lt;/span&gt; + afterMapping / (1024 * 1024) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MB&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Heap memory increase: &amp;#34;&lt;/span&gt; + (afterMapping - beforeMapping) / 1024 + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;KB&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;See? The file data isn&amp;#39;t in our heap - it&amp;#39;s managed by the OS!&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Access some data to trigger page faults
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(1000000, buffer.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;()); i += 4096) {
                buffer.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(i); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Access one byte per page (4KB)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; afterAccess = runtime.&lt;span style=&#34;color:#bbb&#34;&gt;totalMemory&lt;/span&gt;() - runtime.&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Heap memory after accessing data: &amp;#34;&lt;/span&gt; + afterAccess / (1024 * 1024) + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MB&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Still barely any heap usage!&amp;#34;&lt;/span&gt;);

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;the-real-magic-what-makes-this-so-fast&#34;&gt;The Real Magic: What Makes This So Fast?&lt;/h3&gt;
&lt;h4 id=&#34;1-no-data-copying&#34;&gt;1. No Data Copying&lt;/h4&gt;
&lt;p&gt;Traditional file reading copies data from &lt;strong&gt;disk → OS buffer → your application&amp;rsquo;s memory&lt;/strong&gt;. Memory mapping eliminates that middle step. Your application directly accesses the OS&amp;rsquo;s file cache.&lt;/p&gt;
&lt;h4 id=&#34;2-lazy-loading&#34;&gt;2. Lazy Loading&lt;/h4&gt;
&lt;p&gt;The file isn&amp;rsquo;t actually read until you access specific parts. If you have a 10GB file but only read the first 100MB, only that 100MB gets loaded into RAM.&lt;/p&gt;
&lt;h4 id=&#34;3-shared-memory&#34;&gt;3. Shared Memory&lt;/h4&gt;
&lt;p&gt;Multiple processes can map the same file and share the same physical RAM pages. If you have 5 Java processes all analyzing the same log file, they all share the same cached data.&lt;/p&gt;
&lt;h4 id=&#34;4-os-optimization&#34;&gt;4. OS Optimization&lt;/h4&gt;
&lt;p&gt;The operating system is incredibly smart about predicting what you&amp;rsquo;ll read next. If you&amp;rsquo;re &lt;strong&gt;reading sequentially&lt;/strong&gt;, it starts loading the next few pages in advance. If you&amp;rsquo;re jumping around randomly, it keeps recently accessed pages in cache.&lt;/p&gt;
&lt;h3 id=&#34;the-dark-side-when-memory-mapping-goes-wrong&#34;&gt;The Dark Side: When Memory Mapping Goes Wrong&lt;/h3&gt;
&lt;p&gt;As we know every magic trick have its costs or its dark side let us explore what are the core costs and limitations of Memory Mapping a file.&lt;/p&gt;
&lt;h4 id=&#34;the-32-bit-limitation&#34;&gt;The 32-bit Limitation&lt;/h4&gt;
&lt;p&gt;On 32-bit systems, you can only map about 2-4GB total across your entire process. Try to map a 10GB file, and you&amp;rsquo;ll get an IOException. This is because virtual address space is limited to 4GB total, and your heap, stack, and other stuff need space too.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This will fail on 32-bit systems with large files
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
    MappedByteBuffer buffer = channel.&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(FileChannel.&lt;span style=&#34;color:#bbb&#34;&gt;MapMode&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;READ_ONLY&lt;/span&gt;, 0, tenGigabyteFileSize);
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
    System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Probably hit virtual address space limit: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;the-file-locking-problem&#34;&gt;The File Locking Problem&lt;/h4&gt;
&lt;p&gt;While your file is mapped, the OS holds a lock on it. Other processes can&amp;rsquo;t delete or modify the file. I&amp;rsquo;ve seen production deployments fail because a mapped log file couldn&amp;rsquo;t be rotated.&lt;/p&gt;
&lt;h4 id=&#34;the-platform-dependency&#34;&gt;The Platform Dependency&lt;/h4&gt;
&lt;p&gt;Memory mapping performance varies wildly between operating systems. Windows, Linux, and macOS all implement it differently, with different page sizes and caching strategies.&lt;/p&gt;
&lt;h4 id=&#34;performance-showdown-the-numbers-dont-lie&#34;&gt;Performance Showdown: The Numbers Don&amp;rsquo;t Lie&lt;/h4&gt;
&lt;p&gt;I ran some benchmarks on a 200MB log file to show you the difference:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;=== Files.readAllLines() Test ===
Heap memory before reading: 3MB
Lines read: 1673704
Reading took: 793ms
Heap memory after reading: 311MB
Heap memory increase: 308MB
Notice: The entire file is now loaded in heap memory!
Found 700 error lines

=== BufferedReader Test ===
Heap memory before reading: 313MB
Lines read: 1673704
Reading took: 836ms
Heap memory after reading: 498MB
Heap memory increase: 185MB
Notice: BufferedReader processes line by line without loading entire file!
Found 700 error lines
File size: 200MB

==== Memory Mapping Test ====

=== Random Access Test ===
Byte at position 0: 2
Byte at position 52428859: e
Byte at position 104857719: ]
Byte at position 157286578: 

Byte at position 209715437: 

Random access took: 4ms
Notice how fast that was? No disk seeks needed after the first few page faults!

=== Sequential Access Test ===
Counted 1000 lines
Sequential access took: 4ms
The OS optimized this by reading ahead!

=== Pattern Search Test ===
Found 700 errors
Pattern search took: 612ms
We just searched through the entire file without loading it all into heap memory!
Heap memory before mapping: 500MB
Heap memory after mapping 200MB file: 500MB
Heap memory increase: 0KB
See? The file data isn&amp;#39;t in our heap - it&amp;#39;s managed by the OS!
Heap memory after accessing data: 502MB
Still barely any heap usage!

Process finished with exit code 0

&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The memory-mapped version is really faster than traditional reading and used 100x less memory in pattern search.&lt;/p&gt;
&lt;h4 id=&#34;when-to-use-memory-mapping&#34;&gt;When to Use Memory Mapping&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Perfect scenarios:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log analysis tools that need to jump around files&lt;/li&gt;
&lt;li&gt;Database implementations (this is how most databases work internally)&lt;/li&gt;
&lt;li&gt;Image processing where you need random pixel access&lt;/li&gt;
&lt;li&gt;Any time you need to treat a file like a giant array&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Avoid when:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re on a 32-bit system with large files&lt;/li&gt;
&lt;li&gt;The file changes frequently while you&amp;rsquo;re reading it&lt;/li&gt;
&lt;li&gt;You only need to read the file once, sequentially&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re in a memory-constrained environment where you can&amp;rsquo;t trust the OS page cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The beauty of memory mapping is that it turns file I/O into memory access, letting the operating system&amp;rsquo;s decades of optimization work for you. It&amp;rsquo;s like having a genius butler who anticipates your every need and fetches data before you even know you want it like Alfred. The full code is in my &lt;a href=&#34;https://github.com/dhrubo55/100DaysOfJava/tree/main/day91&#34;&gt;github&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 90: How I Built a Secret Agent That Infiltrates Any Java Application</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day90/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day90/</id>
    <published>2025-07-18T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">The Spy Inside Your JVM - Creating Java Agents That Monitor your apps</summary>
    <content type="html">&lt;p&gt;Ever had that sinking feeling? A critical application slows to a crawl in production. Users are complaining. You&amp;rsquo;re staring at logs, but they tell you nothing. You wish you could just ask the application, &amp;ldquo;What&amp;rsquo;s taking you so long?&amp;rdquo; Debugging is out; you can&amp;rsquo;t just halt a live system. This is where commercial giants like &lt;a href=&#34;https://newrelic.com/&#34;&gt;New Relic&lt;/a&gt; or &lt;a href=&#34;https://www.datadoghq.com/&#34;&gt;Datadog&lt;/a&gt; wave their magic wands and produce beautiful dashboards showing you exactly which methods are the culprits.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1752821092/images-from-blog/platform_infrastructure_iekahu_qfgav9.png&#34; alt=&#34;NewRelic Architecture (Taken from newrelic website)&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen developers wrestle with these black boxes. But what if I told you that the &amp;ldquo;magic&amp;rdquo; isn&amp;rsquo;t magic at all? It&amp;rsquo;s a standard, if somewhat hidden, feature of the JVM. Today, on day 90 of your Java journey, we are going to explore the keys to this kingdom. We&amp;rsquo;re going to build our own Java Agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&amp;rsquo;ll create a simple, powerful tool that can attach to any Java application and measure method execution times, all without touching a single line of the target application&amp;rsquo;s source code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But before that let us understand what is an APM.&lt;/p&gt;
&lt;h3 id=&#34;what-is-an-apm&#34;&gt;What is an APM&lt;/h3&gt;
&lt;p&gt;APM stands for Application Performance Monitoring. It&amp;rsquo;s a system that helps monitor, manage, and optimize the performance of software applications, ensuring they are available and performant for users&lt;/p&gt;
&lt;p&gt;Now let us move on to making a very simple Agent which can monitor the timing of the method execution. But before that let us understand what is a java agent?&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-java-agent-not-ai-but-the-spy-inside&#34;&gt;What is a Java Agent? Not AI but The Spy Inside&lt;/h3&gt;
&lt;p&gt;Think of a Java Agent as a spy you send into the JVM. It&amp;rsquo;s a special JAR file that the JVM gives special privileges to. Its primary mission, using the &lt;code&gt;java.lang.instrument&lt;/code&gt; API, is to intercept classes as they are being loaded. Before a class even gets a chance to run, our agent can step in and rewrite its bytecode on the fly.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There are two ways to deploy your agent:&lt;/em&gt;&lt;/p&gt;
&lt;h4 id=&#34;static-attachment&#34;&gt;Static Attachment:&lt;/h4&gt;
&lt;p&gt;You specify the agent at startup with the -javaagent flag. This is like having your spy embedded from the very beginning.&lt;/p&gt;
&lt;h4 id=&#34;dynamic-attachment&#34;&gt;Dynamic Attachment:&lt;/h4&gt;
&lt;p&gt;You attach the agent to an already running JVM. This is the &amp;ldquo;emergency extraction&amp;rdquo; of diagnostics, more complex but incredibly powerful.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll focus on the static approach today. It&amp;rsquo;s the perfect way to learn what is a java agent.&lt;/p&gt;
&lt;h3 id=&#34;the-agents-entry-point-the-premain-method&#34;&gt;The Agent&amp;rsquo;s Entry Point: The premain Method&lt;/h3&gt;
&lt;p&gt;Just as your application has a main method, our agent has a premain method. The name says it all: it runs before main. This is our beachhead. The JVM calls this method and hands us the most important tool in our arsenal: the Instrumentation object. This object is our license to modify code.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the skeleton of our agent.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In our Agent project
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.instrument.Instrumentation&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyTimingAgent&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;premain&lt;/span&gt;(String agentArgs, Instrumentation inst) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Starting our custom Java Agent...&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The magic will happen here!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For the JVM to recognize this as an agent, we need to add a special entry to our JAR&amp;rsquo;s &lt;code&gt;META-INF/MANIFEST.MF&lt;/code&gt; file. We&amp;rsquo;ll let Maven&amp;rsquo;s &lt;code&gt;maven-jar-plugin&lt;/code&gt; handle this configuration for us. We have another full section about what should this manifest file do and how to write it, a little bit later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-jar-plugin&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.3.0&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;archive&amp;gt;&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;manifest&amp;gt;&lt;/span&gt;
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;addClasspath&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/addClasspath&amp;gt;&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;manifestEntries&amp;gt;&lt;/span&gt;
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;Premain-Class&amp;gt;&lt;/span&gt;
                            com.example.javaagent.MyTimingAgent
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/Premain-Class&amp;gt;&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/manifestEntries&amp;gt;&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/archive&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;the-right-tool-for-the-job-byte-buddy&#34;&gt;The Right Tool for the Job: Byte Buddy&lt;/h3&gt;
&lt;p&gt;Now for the fun part: rewriting bytecode. We could, in theory, do this manually with a low-level library like ASM. That&amp;rsquo;s like trying to assemble a watch from raw metal—incredibly difficult and error-prone. We&amp;rsquo;re going to work smarter. We&amp;rsquo;ll use Byte Buddy, a brilliant, modern library that makes bytecode manipulation feel less like arcane magic and more like writing a fluent, readable builder.&lt;/p&gt;
&lt;p&gt;First, add the Byte Buddy dependency to your agent&amp;rsquo;s pom.xml.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;net.bytebuddy&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;byte-buddy&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.14.16&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;net.bytebuddy&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;byte-buddy-agent&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.14.16&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;our-plan&#34;&gt;Our plan:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mark the Target: We&amp;rsquo;ll create a custom @Monitor annotation to mark the methods we want to time.&lt;/li&gt;
&lt;li&gt;Define the Action: We&amp;rsquo;ll create an &amp;ldquo;advice&amp;rdquo; class that holds the timing logic we want to inject.&lt;/li&gt;
&lt;li&gt;Execute the Mission: We&amp;rsquo;ll tell Byte Buddy to find all methods marked with @Monitor and wrap them with our timing logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, the &lt;code&gt;@Monitor&lt;/code&gt; annotation. This can live in a separate shared JAR, but for simplicity, we&amp;rsquo;ll define it within the agent project.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent.annotations&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.ElementType&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.Retention&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.RetentionPolicy&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.annotation.Target&lt;/span&gt;;

&lt;span style=&#34;color:#ffa500&#34;&gt;@Retention&lt;/span&gt;(RetentionPolicy.&lt;span style=&#34;color:#bbb&#34;&gt;RUNTIME&lt;/span&gt;)
&lt;span style=&#34;color:#ffa500&#34;&gt;@Target&lt;/span&gt;(ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;METHOD&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#ffa500&#34;&gt;@interface&lt;/span&gt; Monitor {
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Next, our &lt;em&gt;&amp;ldquo;advice&amp;rdquo;&lt;/em&gt;. This is the code that Byte Buddy will weave into the target methods. The &lt;code&gt;@Advice&lt;/code&gt; annotations make this incredibly intuitive.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In our Agent project
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;net.bytebuddy.asm.Advice&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;TimerAdvice&lt;/span&gt; {

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Advice.OnMethodEnter&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onEnter&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Executed at the start of the method
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;();
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Advice.OnMethodExit&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onExit&lt;/span&gt;(&lt;span style=&#34;color:#ffa500&#34;&gt;@Advice.Origin&lt;/span&gt; String method, &lt;span style=&#34;color:#ffa500&#34;&gt;@Advice.Enter&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; startTime) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Executed at the end of the method
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; duration = System.&lt;span style=&#34;color:#bbb&#34;&gt;nanoTime&lt;/span&gt;() - startTime;
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Method &amp;#39;%s&amp;#39; executed in %d ns (%d ms)%n&amp;#34;&lt;/span&gt;, method, duration, duration / 1_000_000);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Finally, we update our premain method to put Byte Buddy to work.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In our Agent project
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent.annotations.Monitor&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;net.bytebuddy.agent.builder.AgentBuilder&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;net.bytebuddy.asm.Advice&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;net.bytebuddy.matcher.ElementMatchers&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.instrument.Instrumentation&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyTimingAgent&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;premain&lt;/span&gt;(String agentArgs, Instrumentation inst) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Starting our custom Java Agent...&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AgentBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;Default&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;type&lt;/span&gt;(ElementMatchers.&lt;span style=&#34;color:#bbb&#34;&gt;any&lt;/span&gt;()) &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Look at any class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            .&lt;span style=&#34;color:#bbb&#34;&gt;transform&lt;/span&gt;((builder, typeDescription, classLoader, module, protectionDomain) -&amp;gt;
                builder.&lt;span style=&#34;color:#bbb&#34;&gt;method&lt;/span&gt;(ElementMatchers.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotatedWith&lt;/span&gt;(Monitor.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Find methods with our annotation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                       .&lt;span style=&#34;color:#bbb&#34;&gt;intercept&lt;/span&gt;(Advice.&lt;span style=&#34;color:#bbb&#34;&gt;to&lt;/span&gt;(TimerAdvice.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Apply our advice
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            ).&lt;span style=&#34;color:#bbb&#34;&gt;installOn&lt;/span&gt;(inst);
            
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Agent installation complete.&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This beautiful, fluent code is our mission directive. It tells Byte Buddy to find any method, anywhere, that has our &lt;code&gt;@Monitor&lt;/code&gt; annotation and wrap it with the logic from TimerAdvice.&lt;/p&gt;
&lt;h3 id=&#34;attaching-agent-to-the-target-application&#34;&gt;Attaching Agent To The Target Application&lt;/h3&gt;
&lt;p&gt;Now, let&amp;rsquo;s create a simple application to test our agent on. This is a completely separate project.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In our Target Application project
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.example.javaagent.annotations.Monitor&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MonitoredApp&lt;/span&gt; {

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Monitor&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;doWork&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--&amp;gt; Doing some important work...&amp;#34;&lt;/span&gt;);
        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(200);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--&amp;gt; Work finished.&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Monitor&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;doMoreWork&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--&amp;gt; Doing even more work...&amp;#34;&lt;/span&gt;);
        Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(500);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--&amp;gt; More work finished.&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;doUnmonitoredWork&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--&amp;gt; This work is not being monitored.&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        MonitoredApp app = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; MonitoredApp();
        app.&lt;span style=&#34;color:#bbb&#34;&gt;doWork&lt;/span&gt;();
        app.&lt;span style=&#34;color:#bbb&#34;&gt;doMoreWork&lt;/span&gt;();
        app.&lt;span style=&#34;color:#bbb&#34;&gt;doUnmonitoredWork&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Notice how clean this is. The application code only knows about the @Monitor annotation. It has no idea its methods are about to be timed by an external agent.&lt;/p&gt;
&lt;h3 id=&#34;the-grand-finale-running-with-the-agent&#34;&gt;The Grand Finale: Running with the Agent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Build the Agent: In your agent project, run mvn clean package. This creates your agent JAR (e.g., agent-1.0.jar).&lt;/li&gt;
&lt;li&gt;Build the App: Compile your MonitoredApp.&lt;/li&gt;
&lt;li&gt;Launch: Run the application using the -javaagent flag.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;the-agent-manifest-your-license-to-spy&#34;&gt;The Agent Manifest: Your License to Spy&lt;/h4&gt;
&lt;p&gt;The agent should have a manifest file where it is described. The manifest file (&lt;code&gt;META-INF/MANIFEST.MF&lt;/code&gt;) is what tells the JVM how to handle your agent JAR. Here&amp;rsquo;s what it should contain:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Manifest-Version: 1.0
Premain-Class: com.example.javaagent.MyTimingAgent
Agent-Class: com.example.javaagent.MyTimingAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Boot-Classpath-Append: byte-buddy-1.14.16.jar
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Key entries explained:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Premain-Class&lt;/code&gt;: The class containing the &lt;code&gt;premain&lt;/code&gt; method for static attachment&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Agent-Class&lt;/code&gt;: The class containing the &lt;code&gt;agentmain&lt;/code&gt; method for dynamic attachment (optional for our example)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Can-Redefine-Classes&lt;/code&gt;: Allows the agent to redefine classes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Can-Retransform-Classes&lt;/code&gt;: Allows the agent to retransform classes that have already been loaded&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Boot-Classpath-Append&lt;/code&gt;: Adds required dependencies to the bootstrap classpath&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maven will automatically generate this manifest when you build with the configuration we showed earlier in the pom.xml.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Assuming agent JAR is in agent/target/ and app classes are in app/target/classes/&lt;/span&gt;
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;# Make sure the annotation JAR is also on the classpath if it&amp;#39;s separate&lt;/span&gt;

java -javaagent:path/to/my-agent-1.0.jar &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     -cp path/to/target/application/classes:path/to/annotations.jar &lt;span style=&#34;color:#ed9d13&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&lt;/span&gt;     MonitoredApp
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When you hit enter, you&amp;rsquo;ll see the magic happen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Agent deployed. Starting transformation...
Transformation complete. Agent is active.
--&amp;gt; Doing some important work...
--&amp;gt; Work finished.
Method &#39;public void MonitoredApp.doWork() throws java.lang.InterruptedException&#39; took 202 ms
--&amp;gt; Doing even more work...
--&amp;gt; More work finished.
Method &#39;public void MonitoredApp.doMoreWork() throws java.lang.InterruptedException&#39; took 503 ms
--&amp;gt; This work is not being monitored.
---
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There it is. Our agent successfully intercepted the annotated methods and reported their execution time, proving that the &amp;ldquo;magic&amp;rdquo; of APM is well within your grasp. You&amp;rsquo;ve just built a foundational tool that professional engineers use to keep complex systems running smoothly.&lt;/p&gt;
&lt;p&gt;Welcome to the world of Java instrumentation. The spy is in.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 89: When Your Singleton Isn&#39;t Really a Singleton (And How to Fix It)</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day89/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day89/</id>
    <published>2025-06-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">That perfect Singleton you wrote? It&amp;rsquo;s probably creating multiple instances in production—here&amp;rsquo;s why it happens and five bulletproof ways to fix it.</summary>
    <content type="html">&lt;h2 id=&#34;the-story-begins-when-one-becomes-many&#34;&gt;The Story Begins: When One Becomes Many&lt;/h2&gt;
&lt;p&gt;Imagine: You&amp;rsquo;re building a bank&amp;rsquo;s core system, and you need a &lt;strong&gt;logger&lt;/strong&gt; that records every transaction. In your ideal world, this logger should be like that one reliable friend everyone turns to and there&amp;rsquo;s only one person and everyone knows where to find them.&lt;/p&gt;
&lt;p&gt;You craft what seems like the perfect solution:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;TransactionLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; TransactionLogger instance;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;TransactionLogger&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Initialize expensive logging resources
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Logger initialized at: &amp;#34;&lt;/span&gt; + System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;());
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; TransactionLogger &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (instance == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            instance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TransactionLogger();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;log&lt;/span&gt;(String transaction) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;LOG: &amp;#34;&lt;/span&gt; + transaction);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This looks elegant, doesn&amp;rsquo;t it? One class, one instance, problem solved. But there&amp;rsquo;s a twist in our story—and it&amp;rsquo;s about to get interesting.&lt;/p&gt;
&lt;h2 id=&#34;when-reality-strikes-the-race-condition-drama&#34;&gt;When Reality Strikes: The Race Condition Drama&lt;/h2&gt;
&lt;p&gt;Imagine our bank system goes live. Hundreds of customers are making transactions simultaneously. Multiple threads are calling &lt;code&gt;getInstance()&lt;/code&gt; at the exact same moment. What happens next is like a scene from a comedy of errors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Thread A&lt;/strong&gt;: &amp;ldquo;Is instance null? Yes! I&amp;rsquo;ll create one.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thread B&lt;/strong&gt;: &amp;ldquo;Is instance null? Yes! I&amp;rsquo;ll create one too.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thread C&lt;/strong&gt;: &amp;ldquo;Is instance null? Still yes! Another one coming up.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Suddenly, our &amp;ldquo;one and only&amp;rdquo; logger has siblings—multiple instances running around, each thinking they&amp;rsquo;re the chosen one. Our singleton has become a &amp;ldquo;multiple-ton,&amp;rdquo; and chaos ensues.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see this story unfold into code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateTheChaoticScenario&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; numberOfThreads = 100;
    Set&amp;lt;TransactionLogger&amp;gt; instances = ConcurrentHashMap.&lt;span style=&#34;color:#bbb&#34;&gt;newKeySet&lt;/span&gt;();
    CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(numberOfThreads);
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Launch a hundred threads simultaneously
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; numberOfThreads; i++) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
            instances.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(TransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;());
            latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
        }).&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
    }
    
    latch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The shocking revelation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Expected: 1 instance, Actually got: &amp;#34;&lt;/span&gt; + instances.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// You might see: &amp;#34;Expected: 1 instance, Actually got: 7&amp;#34; (or any number &amp;gt; 1)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;the-heroes-enter-thread-safe-patterns-to-the-rescue&#34;&gt;The Heroes Enter: Thread-Safe Patterns to the Rescue&lt;/h2&gt;
&lt;p&gt;Now that we&amp;rsquo;ve seen the villain (race conditions) in action, let&amp;rsquo;s meet our heroes, various thread-safe singleton patterns, each with their own superpowers and weaknesses.&lt;/p&gt;
&lt;h3 id=&#34;hero-1-the-traffic-controller-synchronized-method&#34;&gt;Hero #1: The Traffic Controller (Synchronized Method)&lt;/h3&gt;
&lt;p&gt;Our first hero is like a traffic controller at a busy intersection—only one car gets the green light at a time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SynchronizedTransactionLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; SynchronizedTransactionLogger instance;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SynchronizedTransactionLogger&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Synchronized logger created by: &amp;#34;&lt;/span&gt; + Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; SynchronizedTransactionLogger &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (instance == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            instance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SynchronizedTransactionLogger();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;: Simple and foolproof. No matter how many threads arrive at the intersection, only one gets to proceed at a time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Not-So-Good&lt;/strong&gt;: Here&amp;rsquo;s the catch—even after the construction work at the intersection is done and traffic should flow freely, our traffic controller keeps stopping every single car to check if construction is still ongoing. Every call to &lt;code&gt;getInstance()&lt;/code&gt; waits for the red light, even when it&amp;rsquo;s completely unnecessary.&lt;/p&gt;
&lt;p&gt;Think of it like this: after the first car creates the instance, every subsequent call still has to wait at the traffic light, like being stuck in a construction zone where the work finished hours ago but they forgot to remove the temporary traffic control.&lt;/p&gt;
&lt;h3 id=&#34;hero-2-the-eager-beaver-eager-initialization&#34;&gt;Hero #2: The Eager Beaver (Eager Initialization)&lt;/h3&gt;
&lt;p&gt;Our second hero doesn&amp;rsquo;t wait for anyone. They show up to the party early and stay till the end.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EagerTransactionLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Created immediately when class is loaded
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; EagerTransactionLogger instance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; EagerTransactionLogger();
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;EagerTransactionLogger&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Eager logger ready before anyone asked!&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; EagerTransactionLogger &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// No checks needed, already there!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;: Lightning fast access and completely thread-safe. The JVM&amp;rsquo;s class loader mechanism guarantees that static fields are initialized exactly once, before any thread can access the class.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Not-So-Good&lt;/strong&gt;: Like that friend who always arrives two hours early to every party, even the ones they might not attend. If your singleton is resource-heavy and might never be used, you&amp;rsquo;re paying the cost upfront whether you need it or not.&lt;/p&gt;
&lt;h3 id=&#34;hero-3-the-double-agent-double-checked-locking&#34;&gt;Hero #3: The Double Agent (Double-Checked Locking)&lt;/h3&gt;
&lt;p&gt;Our third hero is sophisticated—they have a two-step verification process that&amp;rsquo;s both secure and efficient.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DoubleCheckedTransactionLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The volatile keyword is crucial here!
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; DoubleCheckedTransactionLogger instance;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;DoubleCheckedTransactionLogger&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Double-checked logger created after careful verification&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; DoubleCheckedTransactionLogger &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// First check - no synchronization needed if already created
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (instance == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (DoubleCheckedTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Second check - inside synchronized block
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (instance == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                    instance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DoubleCheckedTransactionLogger();
                }
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This pattern is like a smart security system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;First Guard&lt;/strong&gt;: &amp;ldquo;Is there already someone inside? Yes? Go ahead!&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Second Guard&lt;/strong&gt;: &amp;ldquo;Wait, let me double-check inside this secure room. Nope, still empty? Okay, you can enter.&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;: After initialization, accessing the instance is as fast as the eager approach. The first null check eliminates synchronization overhead for subsequent calls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Critical Detail&lt;/strong&gt;: The &lt;a href=&#34;https://mohibulsblog.netlify.app/posts/java/100daysofjava/day54/&#34;&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/a&gt; keyword isn&amp;rsquo;t just decoration—it&amp;rsquo;s essential! Without it, you might see a partially constructed object due to the way modern processors reorder instructions. It&amp;rsquo;s like ensuring everyone sees the same version of reality at the same time.&lt;/p&gt;
&lt;h3 id=&#34;hero-4-the-hidden-master-initialization-on-demand-holder&#34;&gt;Hero #4: The Hidden Master (Initialization-on-Demand Holder)&lt;/h3&gt;
&lt;p&gt;Our fourth hero uses ancient Java wisdom—the power of class loading mechanics.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;HolderTransactionLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;HolderTransactionLogger&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Holder logger created by the master of lazy loading&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The secret weapon: a static inner class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;LoggerHolder&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; HolderTransactionLogger INSTANCE = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HolderTransactionLogger();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; HolderTransactionLogger &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; LoggerHolder.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Class loading magic happens here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is like having a wise mentor who only appears when you truly need them. The &lt;code&gt;LoggerHolder&lt;/code&gt; class isn&amp;rsquo;t loaded until someone calls &lt;code&gt;getInstance()&lt;/code&gt;, and when it is loaded, the JVM guarantees thread-safe initialization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;: Lazy initialization without any explicit synchronization. It&amp;rsquo;s elegant, fast, and leverages the JVM&amp;rsquo;s built-in thread safety guarantees.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Beautiful Part&lt;/strong&gt;: No locks, no volatile keywords, no complex logic—just pure Java class loading mechanics doing the heavy lifting.&lt;/p&gt;
&lt;h3 id=&#34;hero-5-the-royal-guard-enum-singleton&#34;&gt;Hero #5: The Royal Guard (Enum Singleton)&lt;/h3&gt;
&lt;p&gt;Our final hero is royalty—they have built-in protection against all forms of attack.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;enum&lt;/span&gt; EnumTransactionLogger {
    INSTANCE;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;EnumTransactionLogger&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Enum logger: Born to be unique!&amp;#34;&lt;/span&gt;);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;log&lt;/span&gt;(String transaction) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ROYAL LOG: &amp;#34;&lt;/span&gt; + transaction);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;doSomething&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Performing singleton operations...&amp;#34;&lt;/span&gt;);
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Usage is simple and elegant
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;EnumTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Transfer completed&amp;#34;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread-safe by design&lt;/li&gt;
&lt;li&gt;Immune to reflection attacks (try to break it, you can&amp;rsquo;t!)&lt;/li&gt;
&lt;li&gt;Handles serialization correctly (no multiple instances even after deserialization)&lt;/li&gt;
&lt;li&gt;Simple and clean syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Limitation&lt;/strong&gt;: Enums can&amp;rsquo;t extend other classes, which might limit your design flexibility in some scenarios.&lt;/p&gt;
&lt;h2 id=&#34;the-ultimate-showdown-choosing-your-champion&#34;&gt;The Ultimate Showdown: Choosing Your Champion&lt;/h2&gt;
&lt;p&gt;Let me tell you a story about choosing the right tool for the job. Imagine you&amp;rsquo;re a chef, and each singleton pattern is a different kitchen appliance:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;th&gt;Like Choosing&amp;hellip;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Synchronized Method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple applications, low concurrency&lt;/td&gt;
&lt;td&gt;A reliable old mixer - slow but dependable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eager Initialization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always-needed singletons, startup cost acceptable&lt;/td&gt;
&lt;td&gt;A rice cooker - ready when you walk in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Double-Checked Locking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High performance needed, comfortable with complexity&lt;/td&gt;
&lt;td&gt;A professional espresso machine - complex but perfect results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Holder Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Most general cases&lt;/td&gt;
&lt;td&gt;A Swiss Army knife - versatile and elegant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enum Singleton&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maximum protection needed&lt;/td&gt;
&lt;td&gt;A bank vault - unbreakable security&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;testing-our-heroes-proving-they-work&#34;&gt;Testing Our Heroes: Proving They Work&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s put our patterns through their paces with a stress test that would make any singleton proud:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;stressTestAllSingletonPatterns&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
    testSingletonThreadSafety(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Holder Pattern&amp;#34;&lt;/span&gt;, HolderTransactionLogger::getInstance);
    testSingletonThreadSafety(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Enum Pattern&amp;#34;&lt;/span&gt;, () -&amp;gt; EnumTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;);
    testSingletonThreadSafety(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Synchronized&amp;#34;&lt;/span&gt;, SynchronizedTransactionLogger::getInstance);
    testSingletonThreadSafety(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Double-Checked&amp;#34;&lt;/span&gt;, DoubleCheckedTransactionLogger::getInstance);
    testSingletonThreadSafety(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Eager&amp;#34;&lt;/span&gt;, EagerTransactionLogger::getInstance);
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testSingletonThreadSafety&lt;/span&gt;(String patternName, Supplier&amp;lt;T&amp;gt; instanceSupplier) 
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; threadCount = 1000;
    Set&amp;lt;T&amp;gt; instances = ConcurrentHashMap.&lt;span style=&#34;color:#bbb&#34;&gt;newKeySet&lt;/span&gt;();
    CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(threadCount);
 
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; threadCount; i++) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
            instances.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(instanceSupplier.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;());
            latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
        }).&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
    }
    
    latch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
    
    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(patternName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; - Instances created: &amp;#34;&lt;/span&gt; + instances.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
    assertEquals(1, instances.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;(), patternName + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; should create only one instance&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;the-moral-of-our-story&#34;&gt;The Moral of Our Story&lt;/h2&gt;
&lt;p&gt;In our journey through the land of thread-safe singletons, we&amp;rsquo;ve learned that the simple question &amp;ldquo;How do I create one instance?&amp;rdquo; has surprisingly complex answers in a multithreaded world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Wisdom I&amp;rsquo;ve Gained:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The naive approach fails&lt;/strong&gt; - Race conditions are real and sneaky&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every solution has trade-offs&lt;/strong&gt; - Performance vs. simplicity vs. features&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Holder Pattern is often the hero&lt;/strong&gt; - Elegant, fast, and thread-safe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enum singletons are the ultimate protection&lt;/strong&gt; - When security matters most&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context matters&lt;/strong&gt; - Choose based on your specific needs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;A Final Thought:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Singletons are like that one friend everyone relies on—powerful when used correctly, but they can make your code harder to test and maintain. Sometimes, dependency injection frameworks offer better alternatives by managing object lifecycles for you.&lt;/p&gt;
&lt;p&gt;Remember, the best singleton pattern is often the one you don&amp;rsquo;t need to write yourself. But when you do need one, now you have an arsenal of thread-safe techniques to choose from.&lt;/p&gt;
&lt;p&gt;The next time someone asks you about thread-safe singletons, you won&amp;rsquo;t just give them code—you&amp;rsquo;ll tell them a story about race conditions, heroes, and the eternal quest for that perfect &amp;ldquo;one and only&amp;rdquo; instance in the chaotic world of multithreaded programming.&lt;/p&gt;
&lt;h2 id=&#34;the-implementation-showcase&#34;&gt;The Implementation Showcase&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a complete working example that demonstrates all patterns in action:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SingletonShowcase&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;=== Singleton Pattern Showcase ===&amp;#34;&lt;/span&gt;);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Test each pattern
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        demonstrateHolderPattern();
        demonstrateEnumPattern();
        demonstrateDoubleCheckedLocking();
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n=== Thread Safety Test ===&amp;#34;&lt;/span&gt;);
        performConcurrencyTest();
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateHolderPattern&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n--- Holder Pattern ---&amp;#34;&lt;/span&gt;);
        HolderTransactionLogger logger1 = HolderTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
        HolderTransactionLogger logger2 = HolderTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Same instance? &amp;#34;&lt;/span&gt; + (logger1 == logger2));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateEnumPattern&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n--- Enum Pattern ---&amp;#34;&lt;/span&gt;);
        EnumTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Testing enum singleton&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Enum instances are always the same: &amp;#34;&lt;/span&gt; + 
            (EnumTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt; == EnumTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;demonstrateDoubleCheckedLocking&lt;/span&gt;() {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n--- Double-Checked Locking ---&amp;#34;&lt;/span&gt;);
        DoubleCheckedTransactionLogger logger1 = DoubleCheckedTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
        DoubleCheckedTransactionLogger logger2 = DoubleCheckedTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Same instance? &amp;#34;&lt;/span&gt; + (logger1 == logger2));
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;performConcurrencyTest&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; threadCount = 100;
        CountDownLatch latch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CountDownLatch(threadCount);
        Set&amp;lt;HolderTransactionLogger&amp;gt; instances = ConcurrentHashMap.&lt;span style=&#34;color:#bbb&#34;&gt;newKeySet&lt;/span&gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; threadCount; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
                instances.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(HolderTransactionLogger.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;());
                latch.&lt;span style=&#34;color:#bbb&#34;&gt;countDown&lt;/span&gt;();
            }).&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        }
        
        latch.&lt;span style=&#34;color:#bbb&#34;&gt;await&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Concurrency test result - Unique instances: &amp;#34;&lt;/span&gt; + instances.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread safety: &amp;#34;&lt;/span&gt; + (instances.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() == 1 ? &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;PASSED&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;FAILED&amp;#34;&lt;/span&gt;));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And there you have it—your complete guide to thread-safe singletons, served with a side of storytelling and practical wisdom. May your instances be single, your threads be safe, and your code be elegant!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 88: Multilingual Audio Transcription with Gemini 1.5, Vertex AI, and Spring Boot</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day88/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day88/</id>
    <published>2025-04-29T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Building a robust multilingual audio transcription system using Spring Boot, Google Cloud Storage, and Vertex AI&amp;rsquo;s Gemini 1.5, covering architecture, prompt engineering, safety settings, confidence scoring, and async/batch processing.</summary>
    <content type="html">&lt;p&gt;As part of my ongoing Java explorations, I recently tackled a practical project that hit the sweet spot between business needs and cutting-edge tech. The challenge? Building a system to transcribe audio files across multiple languages with specific formatting requirements.&lt;/p&gt;
&lt;p&gt;This wasn&amp;rsquo;t just about converting speech to text. The system needed to identify different speakers, handle six different languages, format numbers and dates properly, and flag sections that might need human review. Given these requirements, I decided to leverage Google Cloud&amp;rsquo;s Vertex AI with Gemini 1.5, all orchestrated through a Spring Boot application.&lt;/p&gt;
&lt;h3 id=&#34;the-challenge-beyond-simple-speech-to-text&#34;&gt;The Challenge: Beyond Simple Speech-to-Text&lt;/h3&gt;
&lt;p&gt;Most off-the-shelf transcription tools give you a wall of text and call it a day. Our requirements were much more nuanced:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Multilingual Support&lt;/strong&gt;: The system had to handle English plus five other languages without missing a beat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speaker Diarization&lt;/strong&gt;: We needed clear labels showing who was talking when (e.g., &amp;ldquo;Speaker A:&amp;rdquo;, &amp;ldquo;Speaker B:&amp;quot;), which is surprisingly hard to get right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specific Formatting&lt;/strong&gt;: Each transcript needed timestamps at speaker changes and language-appropriate number/date formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handling Imperfections&lt;/strong&gt;: Real-world audio has issues - background noise, people talking over each other, mumbling. The system needed to handle these gracefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality Assessment&lt;/strong&gt;: We needed some way to flag transcriptions that might need human review.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;architecture-a-spring-boot--google-cloud-symphony&#34;&gt;Architecture: A Spring Boot &amp;amp; Google Cloud Symphony&lt;/h3&gt;
&lt;p&gt;I built a workflow that looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1746182920/spring-boot-gemini-audio-transcription.png&#34; alt=&#34;Architecture&#34;  /&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Audio Ingestion &amp;amp; Preparation&lt;/strong&gt;: The backend receives audio files and converts them to FLAC format. I chose FLAC because it preserves audio quality while keeping file sizes manageable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Storage&lt;/strong&gt;: These FLAC files get uploaded to Google Cloud Storage. This step is crucial - it lets Gemini access potentially large audio files without timing out or hitting memory limits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vertex AI &amp;amp; Gemini 1.5&lt;/strong&gt;: Our Spring Boot app calls Vertex AI, pointing Gemini to the audio file&amp;rsquo;s location. The magic happens in the prompt we send along with this request (more on that in a bit).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processing &amp;amp; Storage&lt;/strong&gt;: Once Gemini does its thing, we parse the response, add our own confidence scoring, and store everything in our database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notification/Feedback&lt;/strong&gt;: For user-triggered transcriptions, we send back success/failure notifications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Using GCS as the middleman was a bit of extra work, but it paid off by making the system more robust when handling larger files.&lt;/p&gt;
&lt;h3 id=&#34;harnessing-gemini-15&#34;&gt;Harnessing Gemini 1.5&lt;/h3&gt;
&lt;p&gt;Gemini 1.5&amp;rsquo;s massive context window and multimodal capabilities made it perfect for handling audio files directly via GCS URIs.&lt;/p&gt;
&lt;h4 id=&#34;prompt-engineering-for-precision&#34;&gt;Prompt Engineering for Precision&lt;/h4&gt;
&lt;p&gt;This was the trickiest part of the whole project. Just saying &amp;ldquo;hey, transcribe this&amp;rdquo; wasn&amp;rsquo;t going to cut it. After many iterations, I landed on this prompt structure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;Please accurately transcribe this audio recording with high attention to detail. %1$s is the preferred language if specified.

I need a professional-quality transcript that captures the following elements:

Language Detection and Handling:
1. If language code is provided ([Language code]):
   - Use this as the primary transcription language
2. If no language code is provided:
   - Detect the spoken language from the audio
   - Transcribe in the detected language
   - Include the detected language code in the response

Formatting Requirements:
- Include timestamps at every speaker change
- Label speakers as &amp;#34;Speaker A:&amp;#34;, &amp;#34;Speaker B:&amp;#34;, etc.
- Use appropriate number formatting for the detected/specified language
- Format dates as DD.MM.YYYY

Language-Specific Guidelines:
[Language code]

Special Instructions:
- Mark unclear speech with [inaudible]
- For overlapping speech, prioritize the main speaker
- Ignore background noise unless relevant
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This prompt spells out exactly what we need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The target language (dynamically inserted at runtime)&lt;/li&gt;
&lt;li&gt;How to format timestamps, speaker labels, numbers, and dates&lt;/li&gt;
&lt;li&gt;Clear instructions for handling tricky situations like unclear speech&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;navigating-safety-settings&#34;&gt;Navigating Safety Settings&lt;/h4&gt;
&lt;p&gt;I hit an unexpected roadblock with Vertex AI&amp;rsquo;s default safety settings. They&amp;rsquo;re designed to prevent harmful content generation, but in our case, they sometimes flagged legitimate business conversations containing certain keywords.&lt;/p&gt;
&lt;p&gt;After some trial and error, I identified which safety categories we could safely disable for our specific use case. This required careful consideration - we needed the full, unfiltered transcription, but we were working with known audio sources in a controlled environment.&lt;/p&gt;
&lt;h3 id=&#34;measuring-confidence-a-pragmatic-approach&#34;&gt;Measuring Confidence: A Pragmatic Approach&lt;/h3&gt;
&lt;p&gt;One challenge with LLMs is they don&amp;rsquo;t give you a simple &amp;ldquo;I&amp;rsquo;m 87% confident in this transcription&amp;rdquo; score. However, Gemini does return log probabilities (&lt;code&gt;avg_logprobs&lt;/code&gt;) for the generated tokens, which provide some insight into the model&amp;rsquo;s internal confidence.&lt;/p&gt;
&lt;p&gt;I cobbled together a basic confidence scoring system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Extract the &lt;code&gt;avg_logprobs&lt;/code&gt; from the API response&lt;/li&gt;
&lt;li&gt;Set a threshold based on experimentation (around &lt;code&gt;-0.4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;If the average log probability falls below this threshold, flag that transcript for human review&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s not perfect, but it gave us a practical way to identify potentially problematic transcriptions that might need a second pair of eyes.&lt;/p&gt;
&lt;h3 id=&#34;implementation-async-vs-batch-processing&#34;&gt;Implementation: Async vs. Batch Processing&lt;/h3&gt;
&lt;p&gt;To handle different use cases, I implemented two processing modes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Asynchronous Processing&lt;/strong&gt;: For user-triggered transcriptions, we process things in the background using Spring&amp;rsquo;s &lt;code&gt;@Async&lt;/code&gt; annotations. The user gets an immediate acknowledgment, and we notify them when the job completes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Batch Processing&lt;/strong&gt;: For processing backlogs of audio files, I built a scheduled job using Spring&amp;rsquo;s &lt;code&gt;@Scheduled&lt;/code&gt; annotation. This runs during off-hours, picking up unprocessed files and working through them methodically.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;SafetySetting&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getCustomSafetySettings&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;SafetySetting&amp;gt; safetySettings = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        safetySettings.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;setCategory&lt;/span&gt;(HarmCategory.&lt;span style=&#34;color:#bbb&#34;&gt;HARM_CATEGORY_DANGEROUS_CONTENT&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;setThreshold&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;HarmBlockThreshold&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;BLOCK_NONE&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;());
        safetySettings.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;setCategory&lt;/span&gt;(HarmCategory.&lt;span style=&#34;color:#bbb&#34;&gt;HARM_CATEGORY_HARASSMENT&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;setThreshold&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;HarmBlockThreshold&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;BLOCK_NONE&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;());
        safetySettings.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;setCategory&lt;/span&gt;(HarmCategory.&lt;span style=&#34;color:#bbb&#34;&gt;HARM_CATEGORY_SEXUALLY_EXPLICIT&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;setThreshold&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;HarmBlockThreshold&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;BLOCK_NONE&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;());
        safetySettings.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;setCategory&lt;/span&gt;(HarmCategory.&lt;span style=&#34;color:#bbb&#34;&gt;HARM_CATEGORY_HATE_SPEECH&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;setThreshold&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;HarmBlockThreshold&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;BLOCK_NONE&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;());
        safetySettings.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;setCategory&lt;/span&gt;(HarmCategory.&lt;span style=&#34;color:#bbb&#34;&gt;HARM_CATEGORY_UNSPECIFIED&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;setThreshold&lt;/span&gt;(SafetySetting.&lt;span style=&#34;color:#bbb&#34;&gt;HarmBlockThreshold&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;BLOCK_NONE&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; safetySettings;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; SpeechToTextInfo &lt;span style=&#34;color:#447fcf&#34;&gt;transcribeAudioWithGeminiSync&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String gcsUri,
                                                           &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SpeechToTextInfo pendingInfo) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            log.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Transcribing audio synchronously with Gemini for callId: {} and recordingId: {}&amp;#34;&lt;/span&gt;,
                    pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getCallId&lt;/span&gt;(), pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getRecordId&lt;/span&gt;());

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; GenerativeModel model = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; GenerativeModel(modelName, vertexAI);
            model.&lt;span style=&#34;color:#bbb&#34;&gt;withSafetySettings&lt;/span&gt;(getCustomSafetySettings());

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; GenerateContentResponse response = model.&lt;span style=&#34;color:#bbb&#34;&gt;generateContent&lt;/span&gt;(
                    ContentMaker.&lt;span style=&#34;color:#bbb&#34;&gt;fromMultiModalData&lt;/span&gt;(
                            buildPrompt(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;),
                            PartMaker.&lt;span style=&#34;color:#bbb&#34;&gt;fromMimeTypeAndData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;audio/flac&amp;#34;&lt;/span&gt;, gcsUri)
                    ));

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ImmutableGeminiSpeechToTextTranscriptInfo.&lt;span style=&#34;color:#bbb&#34;&gt;Builder&lt;/span&gt; transcriptInfoBuilder =
                    ImmutableGeminiSpeechToTextTranscriptInfo.&lt;span style=&#34;color:#bbb&#34;&gt;builder&lt;/span&gt;();

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; avgLogProbs = response.&lt;span style=&#34;color:#bbb&#34;&gt;getCandidates&lt;/span&gt;(0).&lt;span style=&#34;color:#bbb&#34;&gt;getAvgLogprobs&lt;/span&gt;();
            transcriptInfoBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;hasAcceptableConfidence&lt;/span&gt;(avgLogProbs &amp;gt;= CONFIDENCE_THRESHOLD)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;avgLogProbs&lt;/span&gt;(avgLogProbs);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String transcript = ResponseHandler.&lt;span style=&#34;color:#bbb&#34;&gt;getText&lt;/span&gt;(response);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SpeechToTextInfo completedInfo = SpeechToTextInfo.&lt;span style=&#34;color:#bbb&#34;&gt;from&lt;/span&gt;(pendingInfo)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;setTranscript&lt;/span&gt;(transcript)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;setStatus&lt;/span&gt;(SpeechToTextState.&lt;span style=&#34;color:#bbb&#34;&gt;success&lt;/span&gt;)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;setTranscriptsInfo&lt;/span&gt;(ImmutableList.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(transcriptInfoBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;()))
                    .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// save into db
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; completedInfo;

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Exception e) {
            log.&lt;span style=&#34;color:#bbb&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to transcribe audio synchronously for callId: {}&amp;#34;&lt;/span&gt;,
                    pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getCallId&lt;/span&gt;(), e);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SpeechToTextInfo failedInfo = SpeechToTextInfo.&lt;span style=&#34;color:#bbb&#34;&gt;from&lt;/span&gt;(pendingInfo)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;setStatus&lt;/span&gt;(SpeechToTextState.&lt;span style=&#34;color:#bbb&#34;&gt;failed&lt;/span&gt;)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// save into db
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; failedInfo;
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;transcribeAudioWithGemini&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String gcsUri, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String language,
                                           &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SpeechToTextInfo pendingInfo) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            log.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Transcribing audio with Gemini for callId: {} and recordingId: {}&amp;#34;&lt;/span&gt;,
                    pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getCallId&lt;/span&gt;(), pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getRecordId&lt;/span&gt;());

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; GenerativeModel model = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; GenerativeModel(modelName, vertexAI);
            model.&lt;span style=&#34;color:#bbb&#34;&gt;withSafetySettings&lt;/span&gt;(getCustomSafetySettings());

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ApiFuture&amp;lt;GenerateContentResponse&amp;gt; response = model.&lt;span style=&#34;color:#bbb&#34;&gt;generateContentAsync&lt;/span&gt;(
                    ContentMaker.&lt;span style=&#34;color:#bbb&#34;&gt;fromMultiModalData&lt;/span&gt;(
                            buildPrompt(language),
                            PartMaker.&lt;span style=&#34;color:#bbb&#34;&gt;fromMimeTypeAndData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;audio/flac&amp;#34;&lt;/span&gt;, gcsUri)
                    ));

            log.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Transcribing audio with Gemini for callId: {} and recordingId: {} and response {}&amp;#34;&lt;/span&gt;,
                    pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getCallId&lt;/span&gt;(), pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getRecordId&lt;/span&gt;(), response);
            ApiFutures.&lt;span style=&#34;color:#bbb&#34;&gt;addCallback&lt;/span&gt;(response, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ApiFutureCallback&amp;lt;GenerateContentResponse&amp;gt;() {
                &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onSuccess&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; GenerateContentResponse result) {
                    log.&lt;span style=&#34;color:#bbb&#34;&gt;debug&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Transcribing audio with Gemini for callId: {} and recordingId: {} and result {}&amp;#34;&lt;/span&gt;,
                            pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getCallId&lt;/span&gt;(), pendingInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getRecordId&lt;/span&gt;(), result);
                    processTranscription(result, pendingInfo);
                }

                &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;onFailure&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Throwable t) {
                    handleTranscriptionFailure(pendingInfo, t);
                }
            }, MoreExecutors.&lt;span style=&#34;color:#bbb&#34;&gt;directExecutor&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Exception e) {
            handleTranscriptionFailure(pendingInfo, e);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;learnings-and-final-thoughts&#34;&gt;Learnings and Final Thoughts&lt;/h3&gt;
&lt;p&gt;This project taught me a ton about applying LLMs to practical business problems. My key takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemini 1.5 is a beast&lt;/strong&gt; for these kinds of tasks, especially when working with audio through GCS integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt engineering makes or breaks you&lt;/strong&gt;. The difference between a useless transcript and a perfect one often comes down to how clearly you communicate your requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safety settings matter&lt;/strong&gt;. Understanding what they do and how to configure them for your specific use case is crucial.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Imperfect signals can still be useful&lt;/strong&gt;. Even though &lt;code&gt;avg_logprobs&lt;/code&gt; isn&amp;rsquo;t a perfect confidence metric, it gave us a practical way to implement human-in-the-loop review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot&amp;rsquo;s flexibility shines&lt;/strong&gt; when implementing both async and batch processing patterns to handle different use cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wrangling all these technologies together was challenging but incredibly satisfying. There&amp;rsquo;s something deeply rewarding about seeing a complex system like this come together to solve a real business problem.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 87: Java&#39;s Environment Variable Paradox: Easy to Read, Impossible to Change?</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day87/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day87/</id>
    <published>2025-03-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Exploring how to read and delete environment variables in Java with practical examples</summary>
    <content type="html">&lt;p&gt;Have you ever needed to access or modify environment variables in your Java application? If you&amp;rsquo;re like me, you&amp;rsquo;ve probably reached for &lt;code&gt;System.getenv()&lt;/code&gt; to read variables, but then scratched your head wondering how to update them.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s post, I&amp;rsquo;ll dive into environment variables in Java 21 - something I&amp;rsquo;ve been playing with recently. We&amp;rsquo;ll look at how to read them (the easy part) and explore different approaches to modify them (the not-so-easy part).&lt;/p&gt;
&lt;h3 id=&#34;tldr&#34;&gt;TLDR&lt;/h3&gt;
&lt;p&gt;Java makes reading env variables easy (System.getenv()), but modifying them is restricted&lt;/p&gt;
&lt;h4 id=&#34;four-options-for-modification&#34;&gt;Four options for modification:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;ProcessBuilder for child processes only&lt;/li&gt;
&lt;li&gt;JNA for native system function access&lt;/li&gt;
&lt;li&gt;Reflection hacks (avoid in production!)&lt;/li&gt;
&lt;li&gt;Native OS commands (setx/export)&lt;/li&gt;
&lt;li&gt;Best practice: Load env variables at startup rather than modifying at runtime&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;what-are-environment-variables-anyway&#34;&gt;What are Environment Variables anyway?&lt;/h3&gt;
&lt;p&gt;Before jumping into code, let&amp;rsquo;s take a step back. Environment variables are basically key-value pairs that live outside your application. They&amp;rsquo;re part of the environment in which your process runs.&lt;/p&gt;
&lt;p&gt;I like to think of them as a global configuration that follows your application around. They&amp;rsquo;re incredibly useful for things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storing database connection strings (so they&amp;rsquo;re not hardcoded in your app)&lt;/li&gt;
&lt;li&gt;Setting up API keys (without exposing them in your code repository)&lt;/li&gt;
&lt;li&gt;Configuring different behavior across environments (dev/staging/prod)&lt;/li&gt;
&lt;li&gt;Storing system paths and user information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re working with containerized applications or microservices, you&amp;rsquo;re probably already using environment variables extensively.&lt;/p&gt;
&lt;h3 id=&#34;reading-environment-variables-in-java&#34;&gt;Reading Environment Variables in Java&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s start with the easy part - reading environment variables. Java provides a couple of straightforward methods for this.&lt;/p&gt;
&lt;h4 id=&#34;the-classic-systemgetenv-approach&#34;&gt;The Classic System.getenv() Approach&lt;/h4&gt;
&lt;p&gt;This is the method I use :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EnvReader&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Get a specific variable
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String path = System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;PATH&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;My PATH is: &amp;#34;&lt;/span&gt; + path);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Or get all environment variables at once
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Map&amp;lt;String, String&amp;gt; env = System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;All my environment variables:&amp;#34;&lt;/span&gt;);
        env.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;((key, value) -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(key + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + value));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Simple and effective! You can either get a specific variable by name or grab all of them as a Map.&lt;/p&gt;
&lt;p&gt;Using ProcessBuilder for Environment Access
There&amp;rsquo;s another approach using ProcessBuilder that I find useful, especially when working with subprocesses:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ProcessBuilderEnvReader&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        ProcessBuilder processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder();
        Map&amp;lt;String, String&amp;gt; environment = processBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;environment&lt;/span&gt;();
        
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;My environment variables via ProcessBuilder:&amp;#34;&lt;/span&gt;);
        environment.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;((key, value) -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(key + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; = &amp;#34;&lt;/span&gt; + value));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The nice thing about ProcessBuilder is that you can modify this environment map for any subprocesses you launch - more on that shortly.&lt;/p&gt;
&lt;h3 id=&#34;the-tricky-part-modifying-environment-variables&#34;&gt;The Tricky Part: Modifying Environment Variables&lt;/h3&gt;
&lt;p&gt;Now comes the challenging part. Unlike reading environment variables, Java doesn&amp;rsquo;t provide direct methods to modify them in the current process. This is actually by design for security reasons.&lt;/p&gt;
&lt;p&gt;However, there are several workarounds we can use. Let&amp;rsquo;s explore them.&lt;/p&gt;
&lt;h4 id=&#34;approach-1-modifying-environment-for-child-processes&#34;&gt;Approach 1: Modifying Environment for Child Processes&lt;/h4&gt;
&lt;p&gt;This is the most straightforward approach. While you can&amp;rsquo;t change the current process&amp;rsquo;s environment, you can set environment variables for any child processes you launch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EnvSetterForChildProcess&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            ProcessBuilder pb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-version&amp;#34;&lt;/span&gt;);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Here&amp;#39;s where the magic happens
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            pb.&lt;span style=&#34;color:#bbb&#34;&gt;environment&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_CUSTOM_VAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello from parent!&amp;#34;&lt;/span&gt;);
            
            Process process = pb.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; exitCode = process.&lt;span style=&#34;color:#bbb&#34;&gt;waitFor&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Process finished with exit code: &amp;#34;&lt;/span&gt; + exitCode);
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | InterruptedException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;strong&gt;limitation?&lt;/strong&gt; This only affects the child process, not your current JVM or the system as a whole.&lt;/p&gt;
&lt;h4 id=&#34;approach-2-using-jna-java-native-access&#34;&gt;Approach 2: Using JNA (Java Native Access)&lt;/h4&gt;
&lt;p&gt;For more control, sometimes we should look into JNA, which lets you access native system functions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.sun.jna.Library&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.sun.jna.Native&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.sun.jna.Platform&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;JNAEnvSetter&lt;/span&gt; {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Interface to C library functions
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CLibrary&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; Library {
        CLibrary INSTANCE = Native.&lt;span style=&#34;color:#bbb&#34;&gt;load&lt;/span&gt;(Platform.&lt;span style=&#34;color:#bbb&#34;&gt;isWindows&lt;/span&gt;() ? &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;msvcrt&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, CLibrary.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setenv&lt;/span&gt;(String name, String value, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; overwrite);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;unsetenv&lt;/span&gt;(String name);
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Set an environment variable
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; result = CLibrary.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;setenv&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_ENV_VAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;my_value&amp;#34;&lt;/span&gt;, 1);
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (result == 0) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Environment variable set successfully&amp;#34;&lt;/span&gt;);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Verify by reading it back
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            String value = System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_ENV_VAR&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_ENV_VAR: &amp;#34;&lt;/span&gt; + value);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to set environment variable&amp;#34;&lt;/span&gt;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Remember to add JNA to your project dependencies if you want to try this approach.&lt;/p&gt;
&lt;h4 id=&#34;approach-3-the-reflection-hack-use-with-caution&#34;&gt;Approach 3: The Reflection Hack (Use with Caution!)&lt;/h4&gt;
&lt;p&gt;I&amp;rsquo;ve seen this approach used, but I generally don&amp;rsquo;t recommend it for production code. It uses reflection to modify the private environment map:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ReflectionEnvSetter&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@SuppressWarnings&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unchecked&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Attempt to update environment variables via ProcessEnvironment fields.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Class&amp;lt;?&amp;gt; processEnvironmentClass = Class.&lt;span style=&#34;color:#bbb&#34;&gt;forName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.lang.ProcessEnvironment&amp;#34;&lt;/span&gt;);
        Field envField = processEnvironmentClass.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredField&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;theEnvironment&amp;#34;&lt;/span&gt;);
        envField.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
        Map&amp;lt;String, String&amp;gt; env = (Map&amp;lt;String, String&amp;gt;) envField.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
        env.&lt;span style=&#34;color:#bbb&#34;&gt;putAll&lt;/span&gt;(newEnv);
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Try to update the case-insensitive environment as well, if present.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Field ciEnvField = processEnvironmentClass.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredField&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;theCaseInsensitiveEnvironment&amp;#34;&lt;/span&gt;);
            ciEnvField.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            &lt;span style=&#34;color:#ffa500&#34;&gt;@SuppressWarnings&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unchecked&amp;#34;&lt;/span&gt;)
            Map&amp;lt;String, String&amp;gt; ciEnv = (Map&amp;lt;String, String&amp;gt;) ciEnvField.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
            ciEnv.&lt;span style=&#34;color:#bbb&#34;&gt;putAll&lt;/span&gt;(newEnv);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (NoSuchFieldException nsfe) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Field not present on this system (e.g., non-Windows), ignore.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Fallback: Modify the unmodifiable map returned by System.getenv()
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Map&amp;lt;String, String&amp;gt; sysEnv = System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;();
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Use reflection to access the internal modifiable map
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Field field = sysEnv.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredField&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;m&amp;#34;&lt;/span&gt;);
            field.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            Map&amp;lt;String, String&amp;gt; modifiableEnv = (Map&amp;lt;String, String&amp;gt;) field.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(sysEnv);
            modifiableEnv.&lt;span style=&#34;color:#bbb&#34;&gt;putAll&lt;/span&gt;(newEnv);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception ex) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to set environment variables&amp;#34;&lt;/span&gt;, ex);
        }
    }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Why don&amp;rsquo;t I recommend this? It&amp;rsquo;s:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Not guaranteed to work across JVM implementations&lt;/li&gt;
&lt;li&gt;May behave differently in future Java versions&lt;/li&gt;
&lt;li&gt;May lead to unexpected behavior or security issues&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ve seen it not work properly so proceed with caution!&lt;/p&gt;
&lt;h4 id=&#34;approach-4-native-os-commands&#34;&gt;Approach 4: Native OS Commands&lt;/h4&gt;
&lt;p&gt;Sometimes the simplest approach is to just execute the appropriate OS command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;NativeEnvSetter&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            ProcessBuilder processBuilder;
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (System.&lt;span style=&#34;color:#bbb&#34;&gt;getProperty&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;toLowerCase&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;)) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Windows way
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;setx&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_ENV_VAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;my_value&amp;#34;&lt;/span&gt;);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Unix/Linux/Mac way
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;export MY_ENV_VAR=my_value&amp;#34;&lt;/span&gt;);
            }
            
            Process process = processBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; exitCode = process.&lt;span style=&#34;color:#bbb&#34;&gt;waitFor&lt;/span&gt;();
            
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Command executed with exit code: &amp;#34;&lt;/span&gt; + exitCode);
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | InterruptedException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On Windows, setx creates a persistent environment variable. On Unix-like systems, export sets it for the current shell session, but it won&amp;rsquo;t persist across sessions unless you add it to your profile files.&lt;/p&gt;
&lt;h3 id=&#34;removing-environment-variables&#34;&gt;Removing Environment Variables&lt;/h3&gt;
&lt;p&gt;Removing environment variables follows similar patterns to creating/updating them:&lt;/p&gt;
&lt;h4 id=&#34;for-child-processes&#34;&gt;For Child Processes&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;ProcessBuilder pb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-version&amp;#34;&lt;/span&gt;);
pb.&lt;span style=&#34;color:#bbb&#34;&gt;environment&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_CUSTOM_VAR&amp;#34;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;using-jna&#34;&gt;Using JNA&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; result = JNAEnvSetter.&lt;span style=&#34;color:#bbb&#34;&gt;CLibrary&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;INSTANCE&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;unsetenv&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MY_ENV_VAR&amp;#34;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;using-os-commands&#34;&gt;Using OS Commands&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For Windows
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ProcessBuilder pb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(
    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/c&amp;#34;&lt;/span&gt;, 
    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;REG DELETE \&amp;#34;HKCU\\Environment\&amp;#34; /V MY_ENV_VAR /f&amp;#34;&lt;/span&gt;
);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// For Unix/Linux/Mac
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;ProcessBuilder pb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(
    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, 
    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unset MY_ENV_VAR&amp;#34;&lt;/span&gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;putting-it-all-together-a-practical-environment-manager&#34;&gt;Putting It All Together: A Practical Environment Manager&lt;/h3&gt;
&lt;p&gt;Let me wrap this up with a complete environment variable manager class that you might find useful in your projects:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;85
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Optional&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EnvironmentManager&lt;/span&gt; {
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Read a specific environment variable
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Optional&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;read&lt;/span&gt;(String name) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Optional.&lt;span style=&#34;color:#bbb&#34;&gt;ofNullable&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;(name));
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Read all environment variables
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;String, String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;readAll&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;getenv&lt;/span&gt;();
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Set an environment variable for child processes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setForChildProcesses&lt;/span&gt;(String name, String value) {
        ProcessBuilder processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder();
        processBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;environment&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(name, value);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Set a system-wide environment variable
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setSystemwide&lt;/span&gt;(String name, String value) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            ProcessBuilder processBuilder;
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (isWindows()) {
                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;setx&amp;#34;&lt;/span&gt;, name, value);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                String command = String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;export %s=\&amp;#34;%s\&amp;#34; &amp;amp;&amp;amp; echo \&amp;#34;export %s=%s\&amp;#34; &amp;gt;&amp;gt; ~/.profile&amp;#34;&lt;/span&gt;, 
                                             name, value, name, value);
                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, command);
            }
            
            Process process = processBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; exitCode = process.&lt;span style=&#34;color:#bbb&#34;&gt;waitFor&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; exitCode == 0;
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | InterruptedException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     * Delete an environment variable system-wide
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;     */&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;delete&lt;/span&gt;(String name) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            ProcessBuilder processBuilder;
            
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (isWindows()) {
                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(
                    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/c&amp;#34;&lt;/span&gt;, 
                    &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;REG DELETE \&amp;#34;HKCU\\Environment\&amp;#34; /V &amp;#34;&lt;/span&gt; + name + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; /f&amp;#34;&lt;/span&gt;
                );
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                String command = String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unset %s &amp;amp;&amp;amp; sed -i &amp;#39;/export %s=/d&amp;#39; ~/.profile&amp;#34;&lt;/span&gt;, name, name);
                processBuilder = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, command);
            }
            
            Process process = processBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; exitCode = process.&lt;span style=&#34;color:#bbb&#34;&gt;waitFor&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; exitCode == 0;
            
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | InterruptedException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isWindows&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;getProperty&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;toLowerCase&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Day 86: Building a Secure Java Sandbox with Custom Class Loaders, Process isolation and Java Platform Module System – Executing JAR and .java Files Safely</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day86/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day86/</id>
    <published>2025-03-12T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a sandbox application that can take JAR or java file and run it securely</summary>
    <content type="html">&lt;p&gt;As software engineers we sometimes have to execute some arbitary code that we found or some jar in (Java) case to figure out what its doing. But copy pasting some code in a system directly is a poor security practice thus having a sandbox environment is a powerful tool for ensuring code isolation, enabling secure execution by restricting access to core libraries and system resources. This blog walks through creating a robust sandbox environment in Java using custom class loaders and security policies—tools that are especially valuable for those working on plugins, user-generated scripts, or controlled environments for evaluating code.&lt;/p&gt;
&lt;h3 id=&#34;the-basics-of-java-sandboxing&#34;&gt;The Basics of Java Sandboxing&lt;/h3&gt;
&lt;p&gt;Sandboxing in Java involves creating a restricted environment where code can execute safely, isolated from the rest of the system. It allows developers to control which resources are accessible, monitor the classes being loaded, and intercept potentially malicious behaviors. Key components in sandboxing include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Class Loaders&lt;/strong&gt;: Responsible for loading classes into the JVM, custom class loaders enable control over which classes and packages can be accessed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Policies&lt;/strong&gt;: Define the permissions granted to loaded code, restricting access to system properties, file systems, network resources, and other sensitive areas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;modern-java-sandboxing-approaches&#34;&gt;Modern Java Sandboxing Approaches&lt;/h3&gt;
&lt;p&gt;As of Java 21, there are several approaches to implement secure sandboxing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Java Platform Module System (JPMS)&lt;/strong&gt; - Using strong encapsulation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process Isolation&lt;/strong&gt; - Running untrusted code in separate JVM processes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom ClassLoaders with Resource Limits&lt;/strong&gt; - Our focus for this article&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;system-architecture&#34;&gt;System Architecture&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&#34;language-ascii&#34; data-lang=&#34;ascii&#34;&gt;┌────────────────────┐
│    Client Code     │
└─────────┬──────────┘
          │
┌─────────▼──────────┐
│   Sandbox Runner   │
├───────────────────-┤
│ - Resource Limits  │
│ - Class Validation │
│ - Access Control   │
└─────────┬──────────┘
          │
┌─────────▼──────────┐
│  Custom ClassLoader │
└────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id=&#34;implementing-the-custom-class-loader&#34;&gt;Implementing the Custom Class Loader&lt;/h3&gt;
&lt;p&gt;Our custom class loader, &lt;code&gt;SandboxClassLoader&lt;/code&gt;, extends &lt;code&gt;URLClassLoader&lt;/code&gt; and overrides the &lt;code&gt;loadClass&lt;/code&gt; method to control which classes can be loaded. This ensures that only classes from allowed packages are accessible.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// filepath: SandboxConfiguration.java
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; record &lt;span style=&#34;color:#447fcf&#34;&gt;SandboxConfiguration&lt;/span&gt;(
    Set&amp;lt;String&amp;gt; allowedPackages,
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; maxMemoryBytes,
    Duration timeout,
    Path tempDirectory
) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; SandboxConfiguration &lt;span style=&#34;color:#447fcf&#34;&gt;getDefault&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SandboxConfiguration(
            Set.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.lang.&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.util.&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.math.&amp;#34;&lt;/span&gt;),
            10_000_000L, &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// 10MB
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Duration.&lt;span style=&#34;color:#bbb&#34;&gt;ofSeconds&lt;/span&gt;(5),
            Path.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;getProperty&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.io.tmpdir&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;sandbox&amp;#34;&lt;/span&gt;)
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// filepath: ModernSandbox.java
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ModernSandbox&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; AutoCloseable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SandboxConfiguration config;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path tempDir;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;String&amp;gt; executionLog;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ModernSandbox&lt;/span&gt;(SandboxConfiguration config) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;config&lt;/span&gt; = config;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;tempDir&lt;/span&gt; = createTempDirectory();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;executionLog&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; ExecutionResult &lt;span style=&#34;color:#447fcf&#34;&gt;runCode&lt;/span&gt;(String sourceCode) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compile code
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            URL[] urls = compileSource(sourceCode);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Run in controlled environment
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ProcessBuilder pb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ProcessBuilder(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-Xmx&amp;#34;&lt;/span&gt; + config.&lt;span style=&#34;color:#bbb&#34;&gt;maxMemoryBytes&lt;/span&gt;(),
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;--add-opens&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;java.base/java.lang=ALL-UNNAMED&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-cp&amp;#34;&lt;/span&gt;, tempDir.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(),
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;UntrustedCode&amp;#34;&lt;/span&gt;
            );

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Add timeout control
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Process process = pb.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; completed = process.&lt;span style=&#34;color:#bbb&#34;&gt;waitFor&lt;/span&gt;(
                config.&lt;span style=&#34;color:#bbb&#34;&gt;timeout&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;(), 
                TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;
            );

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ExecutionResult(
                completed,
                process.&lt;span style=&#34;color:#bbb&#34;&gt;exitValue&lt;/span&gt;(),
                readOutput(process)
            );

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ExecutionResult(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;, -1, e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;close&lt;/span&gt;() {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Cleanup temp files
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        FileUtils.&lt;span style=&#34;color:#bbb&#34;&gt;deleteDirectory&lt;/span&gt;(tempDir.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This policy restricts the code from performing any unauthorized actions, such as accessing the file system or network, by granting only the permissions explicitly added.&lt;/p&gt;
&lt;h3 id=&#34;running-code-in-the-sandbox&#34;&gt;Running Code in the Sandbox&lt;/h3&gt;
&lt;p&gt;With the custom class loader and security policy in place, we can now execute untrusted code securely.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Method&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URL&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SandboxRunner&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Set the security manager and policy
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;setSecurityManager&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SecurityManager());
        Policy.&lt;span style=&#34;color:#bbb&#34;&gt;setPolicy&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SandboxSecurityPolicy());

        String sourceCode = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            public class UntrustedCode {
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                public static void main(String[] args) {
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                    System.out.println(&amp;#34;&lt;/span&gt;Hello from untrusted code!&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;);
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                }
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            }
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compile the source code
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            URL[] classUrls = SandboxUtil.&lt;span style=&#34;color:#bbb&#34;&gt;compileSource&lt;/span&gt;(sourceCode, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;UntrustedCode&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create the sandbox class loader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            SandboxClassLoader sandboxClassLoader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SandboxClassLoader(classUrls);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Load and run the untrusted class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Class&amp;lt;?&amp;gt; untrustedClass = Class.&lt;span style=&#34;color:#bbb&#34;&gt;forName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;UntrustedCode&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, sandboxClassLoader);
            Method mainMethod = untrustedClass.&lt;span style=&#34;color:#bbb&#34;&gt;getMethod&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;, String[].&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
            mainMethod.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, (Object) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[]{});

        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This SandboxRunner class sets up the security manager and policy, compiles the untrusted code, loads it using the SandboxClassLoader, and invokes its main method.&lt;/p&gt;
&lt;h3 id=&#34;testing-the-sandbox&#34;&gt;Testing the Sandbox&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s test the sandbox with code that should be allowed and code that should be restricted.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// filepath: ModernSandboxTest.java
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ModernSandboxTest&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shouldRestrictFileSystemAccess&lt;/span&gt;() {
        String maliciousCode = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            public class UntrustedCode {
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                public static void main(String[] args) throws Exception {
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                    new java.io.File(&amp;#34;&lt;/span&gt;/tmp/evil.&lt;span style=&#34;color:#bbb&#34;&gt;txt&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;).createNewFile();
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;                }
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            }
&lt;/span&gt;&lt;span style=&#34;color:#ed9d13&#34;&gt;            &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;;
            
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (ModernSandbox sandbox = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ModernSandbox(SandboxConfiguration.&lt;span style=&#34;color:#bbb&#34;&gt;getDefault&lt;/span&gt;())) {
            ExecutionResult result = sandbox.&lt;span style=&#34;color:#bbb&#34;&gt;runCode&lt;/span&gt;(maliciousCode);
            assertFalse(result.&lt;span style=&#34;color:#bbb&#34;&gt;successful&lt;/span&gt;());
            assertTrue(result.&lt;span style=&#34;color:#bbb&#34;&gt;output&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;SecurityException&amp;#34;&lt;/span&gt;));
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;real-world-applications&#34;&gt;Real-World Applications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Online IDEs: Running user-submitted code safely&lt;/li&gt;
&lt;li&gt;Plugin Systems: Loading third-party extensions&lt;/li&gt;
&lt;li&gt;Educational Platforms: Executing student assignments&lt;/li&gt;
&lt;li&gt;Code Interview Platforms: Running candidate solutions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;performance-considerations&#34;&gt;Performance Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Process creation: ~100ms overhead&lt;/li&gt;
&lt;li&gt;Memory usage: Configurable per instance&lt;/li&gt;
&lt;li&gt;Compilation time: ~50ms for simple classes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This sandbox implementation provides:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Process isolation for maximum security&lt;/li&gt;
&lt;li&gt;Configurable resource limits&lt;/li&gt;
&lt;li&gt;Automatic cleanup of temporary files&lt;/li&gt;
&lt;li&gt;Comprehensive error handling&lt;/li&gt;
&lt;li&gt;Support for both source files and JARs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Perfect for applications requiring secure execution of untrusted code in production environments.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 85: Idempotent APIs in Java: Concepts, Implementation Strategies, and a Spring Boot File Upload Implementation</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day85/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day85/</id>
    <published>2025-01-02T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Idempotent APIs in Java: Concepts, Implementation Strategies, and a Spring Boot File Upload Implementation</summary>
    <content type="html">&lt;p&gt;Idempotency is a reliable way of building robust API, particularly in distributed systems where retries and network failures are common. This blog explores the concept of idempotency and &lt;strong&gt;multiple ways to implement it&lt;/strong&gt; using a Spring Boot file upload service, ensuring no duplicate uploads occur.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-youll-learn&#34;&gt;What You&amp;rsquo;ll Learn&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Concept of Idempotency&lt;/strong&gt; and why it matters in API design.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Different Approaches to Implementing Idempotency&lt;/strong&gt; in Spring Boot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Practical File Upload Service&lt;/strong&gt; showcasing these approaches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Practices, Pitfalls, and Optimization Tips&lt;/strong&gt; for idempotent APIs.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;key-takeaways&#34;&gt;Key Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Idempotency Prevents Duplicates&lt;/strong&gt;: It ensures reliable APIs, handling retries without creating duplicate files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choose the Right Strategy&lt;/strong&gt;: Options like &lt;strong&gt;Idempotency Keys&lt;/strong&gt;, &lt;strong&gt;Content Hashing&lt;/strong&gt;, or a combination offer flexibility for various use cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Hashing Simplifies Deduplication&lt;/strong&gt;: Hashing automates duplicate detection but requires more compute for large files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combine for Reliability&lt;/strong&gt;: Pairing Idempotency Keys with Content Hashing is robust and handles client errors effectively.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow Best Practices&lt;/strong&gt;: Use strong hashing algorithms, set expiration for keys, and test thoroughly to build resilient APIs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Apply these principles to create efficient, user-friendly, and reliable file upload services.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-why-idempotency-matters-in-file-uploads&#34;&gt;The Problem: Why Idempotency Matters in File Uploads&lt;/h2&gt;
&lt;p&gt;Imagine a scenario where a user uploads a file to your server, but due to network issues, they retry the same request multiple times. Without idempotency, your server might save the same file multiple times, leading to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wasted Storage&lt;/strong&gt;: Duplicate files unnecessarily consume storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconsistent State&lt;/strong&gt;: Multiple records for the same file can cause confusion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Frustration&lt;/strong&gt;: Users might see duplicate entries in their file history.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To address this, an idempotent API ensures that &lt;strong&gt;repeated uploads of the same file result in only one stored copy&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;approaches-to-implementing-idempotency-in-spring-boot&#34;&gt;Approaches to Implementing Idempotency in Spring Boot&lt;/h2&gt;
&lt;p&gt;Here are &lt;strong&gt;four different strategies to implement idempotency&lt;/strong&gt; for a file upload service in Spring Boot:&lt;/p&gt;
&lt;h3 id=&#34;1-idempotency-key-based-deduplication&#34;&gt;1. &lt;strong&gt;Idempotency Key-Based Deduplication&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clients include a unique &lt;code&gt;X-Idempotency-Key&lt;/code&gt; header with each request.&lt;/li&gt;
&lt;li&gt;The server stores this key alongside the uploaded file&amp;rsquo;s metadata.&lt;/li&gt;
&lt;li&gt;If a request with the same key is received again, the server returns the already-stored file&amp;rsquo;s response instead of reprocessing the upload.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1735820992/images-from-blog/idempotency_key_based_deduplication_gim4ca.png&#34; alt=&#34;Idempotency Key-based Deduplication&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Store the &lt;code&gt;idempotencyKey&lt;/code&gt; in a database table.&lt;/li&gt;
&lt;li&gt;Before processing a new upload, check if the key already exists.&lt;/li&gt;
&lt;li&gt;If the key exists, return the corresponding file metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileRecord &lt;span style=&#34;color:#447fcf&#34;&gt;uploadFile&lt;/span&gt;(String idempotencyKey, MultipartFile file) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;findByIdempotencyKey&lt;/span&gt;(idempotencyKey)
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElseGet&lt;/span&gt;(() -&amp;gt; {
                String fileHash = DigestUtils.&lt;span style=&#34;color:#bbb&#34;&gt;md5Hex&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;());
                FileRecord fileRecord = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileRecord();
                fileRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setFilename&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getOriginalFilename&lt;/span&gt;());
                fileRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setFileHash&lt;/span&gt;(fileHash);
                fileRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setIdempotencyKey&lt;/span&gt;(idempotencyKey);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;save&lt;/span&gt;(fileRecord);
            });
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple and effective.&lt;/li&gt;
&lt;li&gt;Works well in systems where clients can reliably generate unique keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Relies on client cooperation to generate unique keys.&lt;/li&gt;
&lt;li&gt;Requires storage and lookup of keys on the server side.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-content-hashing-for-deduplication&#34;&gt;2. &lt;strong&gt;Content Hashing for Deduplication&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The server generates a hash (e.g., MD5 or SHA-256) of the file content.&lt;/li&gt;
&lt;li&gt;Before saving the file, the server checks if a file with the same hash already exists.&lt;/li&gt;
&lt;li&gt;If a match is found, the server rejects the upload or returns the existing file&amp;rsquo;s metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1735820992/images-from-blog/content-hashing-for-deduplication_szr2vl.png&#34; alt=&#34;Content Hashing&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a hash of the file&amp;rsquo;s content.&lt;/li&gt;
&lt;li&gt;Store the hash in the database alongside the file metadata.&lt;/li&gt;
&lt;li&gt;Check for hash collisions before processing new uploads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;String fileHash = DigestUtils.&lt;span style=&#34;color:#bbb&#34;&gt;md5Hex&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;());
fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;findByFileHash&lt;/span&gt;(fileHash).&lt;span style=&#34;color:#bbb&#34;&gt;ifPresent&lt;/span&gt;(existing -&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Duplicate file upload detected.&amp;#34;&lt;/span&gt;);
});
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatic deduplication based on file content.&lt;/li&gt;
&lt;li&gt;No reliance on client behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Computational overhead for hashing large files.&lt;/li&gt;
&lt;li&gt;Collisions are rare but theoretically possible (depending on the hashing algorithm).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-combination-of-idempotency-key-and-content-hash&#34;&gt;3. &lt;strong&gt;Combination of Idempotency Key and Content Hash&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combines the strengths of both strategies.&lt;/li&gt;
&lt;li&gt;Clients provide an &lt;code&gt;X-Idempotency-Key&lt;/code&gt;, but the server also validates file uniqueness using content hashing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1735820992/images-from-blog/Combination_Key_Hash_js2aqb.png&#34; alt=&#34;Combination key &amp;#43; conent hash&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check for the &lt;code&gt;idempotencyKey&lt;/code&gt; in the database.&lt;/li&gt;
&lt;li&gt;If not found, compute the file hash and check for duplicates.&lt;/li&gt;
&lt;li&gt;Save both the &lt;code&gt;idempotencyKey&lt;/code&gt; and file hash in the database.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Code Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileRecord &lt;span style=&#34;color:#447fcf&#34;&gt;uploadFile&lt;/span&gt;(String idempotencyKey, MultipartFile file) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;findByIdempotencyKey&lt;/span&gt;(idempotencyKey)
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElseGet&lt;/span&gt;(() -&amp;gt; {
                String fileHash = DigestUtils.&lt;span style=&#34;color:#bbb&#34;&gt;md5Hex&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;());
                fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;findByFileHash&lt;/span&gt;(fileHash).&lt;span style=&#34;color:#bbb&#34;&gt;ifPresent&lt;/span&gt;(existing -&amp;gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Duplicate file upload detected.&amp;#34;&lt;/span&gt;);
                });
                FileRecord newRecord = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileRecord();
                newRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setIdempotencyKey&lt;/span&gt;(idempotencyKey);
                newRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setFileHash&lt;/span&gt;(fileHash);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;save&lt;/span&gt;(newRecord);
            });
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Robust against client errors (e.g., duplicate idempotency keys).&lt;/li&gt;
&lt;li&gt;Guarantees no duplicate files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adds complexity and slightly more overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-token-based-deduplication&#34;&gt;4. &lt;strong&gt;Token-Based Deduplication&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After a successful upload, the server issues a token (e.g., a UUID or file hash).&lt;/li&gt;
&lt;li&gt;Clients must include this token in subsequent uploads to reference the original file.&lt;/li&gt;
&lt;li&gt;If the token is valid, the server skips the upload and returns the original file&amp;rsquo;s response.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1735820992/images-from-blog/Token-based-deduplication_wyaefe.png&#34; alt=&#34;Token Based Deduplication&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate a token after the first successful upload.&lt;/li&gt;
&lt;li&gt;Store the token alongside the file metadata.&lt;/li&gt;
&lt;li&gt;Require clients to include the token in subsequent requests.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Code Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileRecord &lt;span style=&#34;color:#447fcf&#34;&gt;uploadFileWithToken&lt;/span&gt;(String token, MultipartFile file) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;existsByToken&lt;/span&gt;(token)) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Duplicate upload detected.&amp;#34;&lt;/span&gt;);
    }
    String fileHash = DigestUtils.&lt;span style=&#34;color:#bbb&#34;&gt;md5Hex&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;());
    FileRecord newRecord = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileRecord();
    newRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setToken&lt;/span&gt;(token);
    newRecord.&lt;span style=&#34;color:#bbb&#34;&gt;setFileHash&lt;/span&gt;(fileHash);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileRecordRepository.&lt;span style=&#34;color:#bbb&#34;&gt;save&lt;/span&gt;(newRecord);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Offloads responsibility for deduplication to the client.&lt;/li&gt;
&lt;li&gt;Reduces server-side storage requirements for idempotency keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Potentially less user-friendly, as clients must manage tokens.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;choosing-the-right-approach&#34;&gt;Choosing the Right Approach&lt;/h2&gt;
&lt;p&gt;The best strategy depends on your application&amp;rsquo;s requirements:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Criteria&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Idempotency Key&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Content Hash&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Key + Hash&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Token&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client Cooperation Needed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Efficiency&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computational Overhead&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Robustness Against Duplicates&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;best-practices-for-idempotent-file-uploads&#34;&gt;Best Practices for Idempotent File Uploads&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use Strong Hashing Algorithms:&lt;/strong&gt; Prefer SHA-256 over MD5 for better collision resistance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set Expiry for Idempotency Keys:&lt;/strong&gt; To avoid unbounded growth in storage, set a TTL (time-to-live) for keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test for Edge Cases:&lt;/strong&gt; Simulate network failures and retries during testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provide Clear Error Messages:&lt;/strong&gt; Inform clients why a request was rejected (e.g., duplicate file detected).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Idempotency is a critical design principle for modern APIs, ensuring consistency and reliability in distributed systems. By carefully choosing an implementation strategy—such as idempotency keys, content hashing, or a combination—you can build robust file upload services that prevent duplicate uploads and enhance user experience.&lt;/p&gt;
&lt;h3 id=&#34;next-steps&#34;&gt;Next Steps:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Experiment with the provided code examples.&lt;/li&gt;
&lt;li&gt;Explore additional use cases for idempotency (e.g., payment processing).&lt;/li&gt;
&lt;li&gt;Dive deeper into hashing algorithms and database optimization for production-grade systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By implementing idempotency in your Spring Boot applications, you can create resilient and user-friendly services that handle the challenges of distributed systems gracefully.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 84: Hot Class Reload in Java – A Webpack HMR-like Experience for Java Developers</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day84/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day84/</id>
    <published>2024-10-04T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a hot class reload system (HMR for js) using WatchService and javax.tools api</summary>
    <content type="html">&lt;p&gt;In the world of software development, time is everything. Every developer knows the frustration of waiting for a full application restart just to see a small change take effect. Java developers, in particular, have long dealt with this issue. But what if you didn’t have to stop and restart every time you updated a class? Enter Hot Class Reload (HCR) in Java—a technique that can keep you in the flow, reloading classes on the fly, much like Hot Module Reload (HMR) does in JavaScript.&lt;/p&gt;
&lt;p&gt;In this guide, we’ll walk through how to implement HCR and integrate it into your Java development workflow. By the end, you’ll have a powerful new tool to cut down on those long, unproductive restart times.&lt;/p&gt;
&lt;h3 id=&#34;understanding-hot-class-reload&#34;&gt;Understanding Hot Class Reload&lt;/h3&gt;
&lt;p&gt;Simply put, Hot Class Reload (HCR) allows Java applications to reload classes at runtime. This is incredibly useful in development environments where you’re constantly iterating and tweaking code. Think of it as real-time editing: you change some code, the application picks it up right away—no restart required.&lt;/p&gt;
&lt;p&gt;Hot Class Reload (HCR) is a technique that enables Java applications to reload classes at runtime. This approach is particularly useful in development environments where frequent code changes occur. By leveraging Java&amp;rsquo;s &lt;code&gt;WatchService&lt;/code&gt;, custom class loaders using the &lt;code&gt;javax.tools&lt;/code&gt; api and &lt;code&gt;JavaCompiler&lt;/code&gt; class we can monitor source files for changes, compile them on-the-fly, and reload the updated classes into the running application.&lt;/p&gt;
&lt;h3 id=&#34;how-it-works&#34;&gt;How It Works&lt;/h3&gt;
&lt;p&gt;The core components of our HCR implementation include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;File Watcher&lt;/strong&gt;: Utilizes Java&amp;rsquo;s &lt;code&gt;WatchService&lt;/code&gt; to monitor a directory for changes to &lt;code&gt;.java&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Compilation&lt;/strong&gt;: Uses &lt;code&gt;javax.tools.JavaCompiler&lt;/code&gt; to compile modified Java source files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Class Loader&lt;/strong&gt;: Loads the newly compiled classes into the JVM, replacing the old versions.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;system-flow-diagram&#34;&gt;System Flow Diagram&lt;/h3&gt;
&lt;p&gt;Below is a simplified flow diagram illustrating the HCR process:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1727932300/image_2024-10-03_111134341_fwi3rh.png&#34; alt=&#34;HCR Flowchart&#34;  /&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Source Changes&lt;/strong&gt;: Developers modify Java source files in the specified directory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File Watcher&lt;/strong&gt;: Detects changes and triggers the compilation process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compile &amp;amp; Reload&lt;/strong&gt;: Compiles the modified files and reloads the classes using a custom class loader.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Class Loader&lt;/strong&gt;: Loads the newly compiled class into the jvm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invoke Main Method&lt;/strong&gt;: Exectues the main method by executing the bytecode of the reloaded class.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;implementing-hot-class-reload&#34;&gt;Implementing Hot Class Reload&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a breakdown of the Java program implementing HCR:&lt;/p&gt;
&lt;h3 id=&#34;setting-up-the-environment&#34;&gt;Setting Up the Environment&lt;/h3&gt;
&lt;p&gt;The program initializes by setting up directories for source and compiled classes. It ensures these directories exist and are ready for use.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;HotReload&lt;/span&gt;(String sourceDir, String classDir) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;sourceDir&lt;/span&gt; = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(sourceDir).&lt;span style=&#34;color:#bbb&#34;&gt;toAbsolutePath&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classDir&lt;/span&gt; = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(classDir).&lt;span style=&#34;color:#bbb&#34;&gt;toAbsolutePath&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classLoader&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CustomClassLoader();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;compiler&lt;/span&gt; = ToolProvider.&lt;span style=&#34;color:#bbb&#34;&gt;getSystemJavaCompiler&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;fileManager&lt;/span&gt; = compiler.&lt;span style=&#34;color:#bbb&#34;&gt;getStandardFileManager&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Ensure directories exist
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;sourceDir&lt;/span&gt;);
        Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classDir&lt;/span&gt;);
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to create directories&amp;#34;&lt;/span&gt;, e);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The constructor begins by converting the provided sourceDir and classDir strings into absolute Path objects using &lt;code&gt;Paths.get().toAbsolutePath()&lt;/code&gt;. This ensures that the paths are fully qualified and can be used reliably throughout the application. Next, it initializes the classLoader as an instance of the &lt;code&gt;CustomClassLoader&lt;/code&gt; class, which is responsible for dynamically loading compiled classes. The compiler is set to the system Java compiler obtained from &lt;code&gt;ToolProvider.getSystemJavaCompiler()&lt;/code&gt;, and the fileManager is initialized using the standard file manager from the compiler. This setup allows the class to compile Java source files programmatically. The constructor then attempts to create the directories specified by &lt;code&gt;sourceDir&lt;/code&gt; and &lt;code&gt;classDir&lt;/code&gt; if they do not already exist, using &lt;code&gt;Files.createDirectories()&lt;/code&gt;. If directory creation fails, it throws a RuntimeException to indicate a critical error that prevents the application from proceeding. This ensures that the necessary directory structure is in place for the class to function correctly.&lt;/p&gt;
&lt;h3 id=&#34;watching-for-file-changes&#34;&gt;Watching for File Changes&lt;/h3&gt;
&lt;p&gt;A dedicated thread runs a file watcher that listens for modifications to &lt;code&gt;.java&lt;/code&gt; files in the source directory.The watchForChanges method is responsible for monitoring the source directory for any modifications to .java files and triggering the compileAndReload method when changes are detected. Here is the code for the watchForChanges method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;watchForChanges&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (WatchService watchService = FileSystems.&lt;span style=&#34;color:#bbb&#34;&gt;getDefault&lt;/span&gt;()
        .&lt;span style=&#34;color:#bbb&#34;&gt;newWatchService&lt;/span&gt;()) {
        sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(watchService, StandardWatchEventKinds.&lt;span style=&#34;color:#bbb&#34;&gt;ENTRY_MODIFY&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
            WatchKey key = watchService.&lt;span style=&#34;color:#bbb&#34;&gt;take&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (WatchEvent &amp;lt;&amp;lt; ? &amp;gt; event : key.&lt;span style=&#34;color:#bbb&#34;&gt;pollEvents&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (event.&lt;span style=&#34;color:#bbb&#34;&gt;kind&lt;/span&gt;() == StandardWatchEventKinds.&lt;span style=&#34;color:#bbb&#34;&gt;ENTRY_MODIFY&lt;/span&gt;) {
                    Path changed = sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;((Path) event.&lt;span style=&#34;color:#bbb&#34;&gt;context&lt;/span&gt;());
                    String fileName = changed.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;()
                        .&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (fileName.&lt;span style=&#34;color:#bbb&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.java&amp;#34;&lt;/span&gt;)) {
                        compileAndReload(fileName);
                    }
                }
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!key.&lt;span style=&#34;color:#bbb&#34;&gt;reset&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
            }
        }
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error in file watcher: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;compiling-and-reloading-classes&#34;&gt;Compiling and Reloading Classes&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;compileAndReload&lt;/code&gt; method is designed to handle the compilation of a Java source file and subsequently reload the resulting class if necessary. Upon invocation, it accepts a &lt;code&gt;fileName&lt;/code&gt; parameter, which should be a Java source file (e.g., &amp;ldquo;MyClass.java&amp;rdquo;). The method begins by extracting the class name by removing the &amp;ldquo;.java&amp;rdquo; extension from the provided file name. It then constructs the paths for both the source file and the compiled class file using &lt;code&gt;sourceDir&lt;/code&gt; and &lt;code&gt;classDir&lt;/code&gt;, which are assumed to be defined in the broader context of the class.&lt;/p&gt;
&lt;p&gt;To determine whether recompilation is required, the method compares the modification times of the source file and the corresponding class file. It retrieves the last known modification time from a &lt;code&gt;lastModified&lt;/code&gt; map and obtains the current modification time of the source file. The method checks if the class file exists and whether its modification time is newer than or equal to that of the source file. If these conditions indicate that recompilation is unnecessary, the method exits early.&lt;/p&gt;
&lt;p&gt;Conversely, if recompilation is deemed necessary, it invokes a separate &lt;code&gt;compile&lt;/code&gt; method (details of which are not provided in this snippet) to compile the source file. Upon successful compilation, it calls a &lt;code&gt;reloadClass&lt;/code&gt; method (also not shown) to reload the newly compiled class and updates the &lt;code&gt;lastModified&lt;/code&gt; map with the current modification time. A success message is printed to confirm the successful operation. In the case of a compilation failure, an error message is displayed. The entire process is encapsulated within a try-catch block to effectively manage any exceptions that may arise during the compilation or file operations.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compileAndReload&lt;/span&gt;(String fileName) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        String className = fileName.&lt;span style=&#34;color:#bbb&#34;&gt;replace&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
        Path sourceFile = sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(fileName);
        Path classFile = classDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(className + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.class&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if the file has been modified since last compilation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; lastModTime = lastModified.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(className, 0L);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; currentModTime = Files.&lt;span style=&#34;color:#bbb&#34;&gt;getLastModifiedTime&lt;/span&gt;(sourceFile)
            .&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(classFile) &amp;amp;&amp;amp; Files.&lt;span style=&#34;color:#bbb&#34;&gt;getLastModifiedTime&lt;/span&gt;(classFile)
            .&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;() &amp;gt;= currentModTime &amp;amp;&amp;amp; lastModTime &amp;gt;= currentModTime) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compile the Java file
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; compilationSuccessful = compile(sourceFile);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (compilationSuccessful) {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compilation successful, reload the class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            reloadClass(className);
            lastModified.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(className, currentModTime);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Reloaded: &amp;#34;&lt;/span&gt; + className);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Compilation failed for: &amp;#34;&lt;/span&gt; + className);
        }
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error in compile and reload: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;compile&lt;/code&gt; method is designed to compile a Java source file utilizing the Java Compiler API, providing a structured approach to dynamic compilation. The method begins by accepting a &lt;code&gt;Path&lt;/code&gt; object that represents the source file intended for compilation. To facilitate error handling and reporting, it creates a &lt;code&gt;DiagnosticCollector&lt;/code&gt;, which collects diagnostic information such as errors and warnings encountered during the compilation process.&lt;/p&gt;
&lt;p&gt;Next, the method constructs a collection of &lt;code&gt;JavaFileObject&lt;/code&gt;s from the source file using a &lt;code&gt;fileManager&lt;/code&gt;, likely an instance of &lt;code&gt;StandardJavaFileManager&lt;/code&gt;. This setup is crucial for the Java Compiler API to access the source files correctly. The method then specifies compilation options, particularly the output directory for the compiled classes, using the &lt;code&gt;-d&lt;/code&gt; option.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;CompilationTask&lt;/code&gt; is created using the Java Compiler API, which is configured with several parameters: no custom writer for compiler output (set to null), the file manager, the diagnostic collector, the compilation options, no annotation processors (also null), and the compilation units (the source files). The compilation task is executed by calling &lt;code&gt;task.call()&lt;/code&gt;, which returns a boolean indicating whether the compilation was successful.&lt;/p&gt;
&lt;p&gt;In the event of a compilation failure, the method iterates through the collected diagnostics, printing detailed error information that includes the line number where the error occurred, the source file URI, and the specific error message. This detailed reporting aids in debugging compilation issues effectively. Finally, the method returns the success status of the compilation, providing a clear indication of the outcome.&lt;/p&gt;
&lt;p&gt;This method serves as a programmatic solution for compiling Java source files, making it particularly useful in scenarios where dynamic compilation is required. Its robust error reporting capabilities enhance the developer&amp;rsquo;s ability to troubleshoot and resolve compilation errors efficiently.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compile&lt;/span&gt;(Path sourceFile) {
    DiagnosticCollector&amp;lt;JavaFileObject&amp;gt; diagnostics = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DiagnosticCollector&amp;lt;&amp;gt;();
    Iterable&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; JavaFileObject&amp;gt; compilationUnits = fileManager.&lt;span style=&#34;color:#bbb&#34;&gt;getJavaFileObjectsFromFiles&lt;/span&gt;(Collections.&lt;span style=&#34;color:#bbb&#34;&gt;singletonList&lt;/span&gt;(sourceFile.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;()));

    List&amp;lt;String&amp;gt; options = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;, classDir.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

    JavaCompiler.&lt;span style=&#34;color:#bbb&#34;&gt;CompilationTask&lt;/span&gt; task = compiler.&lt;span style=&#34;color:#bbb&#34;&gt;getTask&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, fileManager, diagnostics, options, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, compilationUnits);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; success = task.&lt;span style=&#34;color:#bbb&#34;&gt;call&lt;/span&gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!success) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Diagnostic&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; JavaFileObject&amp;gt; diagnostic : diagnostics.&lt;span style=&#34;color:#bbb&#34;&gt;getDiagnostics&lt;/span&gt;()) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error on line %d in %s%n&amp;#34;&lt;/span&gt;, diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getLineNumber&lt;/span&gt;(), diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getSource&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;toUri&lt;/span&gt;());
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;));
        }
    }
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; success;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;custom-class-loader&#34;&gt;Custom Class Loader&lt;/h3&gt;
&lt;p&gt;A custom class loader is used to load the compiled class files into the JVM. The reloading happens after the compilation is successful and then it reloads the class. To reload the class we need to implement a custom class loader that will load the changed class and then execute it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;reloadClass&lt;/span&gt;(String className) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        Class &amp;lt;&amp;lt; ? &amp;gt; loadedClass = classLoader.&lt;span style=&#34;color:#bbb&#34;&gt;loadClass&lt;/span&gt;(className);
        Method mainMethod = loadedClass.&lt;span style=&#34;color:#bbb&#34;&gt;getMethod&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;, String[].&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Invoking main method for: &amp;#34;&lt;/span&gt; + className);
        mainMethod.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, (Object) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[0]);
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error reloading class &amp;#34;&lt;/span&gt; + className + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomClassLoader&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ClassLoader {

&lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Class &amp;lt;&amp;lt; ? &amp;gt; loadClass(String name) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; ClassNotFoundException {
    Path classFile = classDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(name + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.class&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(classFile)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] classBytes = Files.&lt;span style=&#34;color:#bbb&#34;&gt;readAllBytes&lt;/span&gt;(classFile);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; defineClass(name, classBytes, 0, classBytes.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
             } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ClassNotFoundException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error loading class &amp;#34;&lt;/span&gt; + name, e);
            }
         }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;loadClass&lt;/span&gt;(name);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now if we want to execute the Hot Reload program we need to do something like this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Day84 reloader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Day84(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;C:\\Users\\mohib\\IdeaProjects\\date-time\\src\\main\\java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;C:\\Users\\mohib\\IdeaProjects\\date-time\\target\\classes&amp;#34;&lt;/span&gt;);
        reloader.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Keep the main thread alive and handle user input
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (BufferedReader reader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InputStreamReader(System.&lt;span style=&#34;color:#bbb&#34;&gt;in&lt;/span&gt;))) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Live reloader is running. Press Enter to exit.&amp;#34;&lt;/span&gt;);
            reader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error reading user input: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exiting live reloader.&amp;#34;&lt;/span&gt;);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this main method we can see that we need to provide the path for the src of the code that you want to hot reload and the classes of those java files and after that it then watches for any changes and then compile and reload the class so that we can see the effect immediately.&lt;/p&gt;
&lt;p&gt;Total code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;104
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;105
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;106
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;107
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;108
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;109
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;110
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;111
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;112
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;113
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;114
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;115
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;116
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;117
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;118
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;119
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;120
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;121
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;122
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;123
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;124
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;125
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;126
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;127
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;128
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;129
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;130
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;131
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;132
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;133
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;134
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;135
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;136
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;137
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;138
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;139
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;140
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;141
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;142
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;143
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;144
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;145
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;146
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;147
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;148
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;149
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;150
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;151
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;152
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;153
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;154
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;155
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;156
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;157
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;158
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;159
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;160
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;161
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;162
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;163
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;164
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;165
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.tools.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Method&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.ConcurrentHashMap&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day84&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path sourceDir;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path classDir;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;String, Long&amp;gt; lastModified = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConcurrentHashMap&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; CustomClassLoader classLoader;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; JavaCompiler compiler;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; StandardJavaFileManager fileManager;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Day84&lt;/span&gt;(String sourceDir, String classDir) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;sourceDir&lt;/span&gt; = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(sourceDir)
            .&lt;span style=&#34;color:#bbb&#34;&gt;toAbsolutePath&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classDir&lt;/span&gt; = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(classDir)
            .&lt;span style=&#34;color:#bbb&#34;&gt;toAbsolutePath&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classLoader&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CustomClassLoader();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;compiler&lt;/span&gt; = ToolProvider.&lt;span style=&#34;color:#bbb&#34;&gt;getSystemJavaCompiler&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;fileManager&lt;/span&gt; = compiler.&lt;span style=&#34;color:#bbb&#34;&gt;getStandardFileManager&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Ensure directories exist
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;sourceDir&lt;/span&gt;);
            Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;classDir&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to create directories&amp;#34;&lt;/span&gt;, e);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;start&lt;/span&gt;() {
        Thread watchThread = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::watchForChanges, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;FileWatcherThread&amp;#34;&lt;/span&gt;);
        watchThread.&lt;span style=&#34;color:#bbb&#34;&gt;setDaemon&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
        watchThread.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Live reloader started. Watching directory: &amp;#34;&lt;/span&gt; + sourceDir);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;watchForChanges&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (WatchService watchService = FileSystems.&lt;span style=&#34;color:#bbb&#34;&gt;getDefault&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;newWatchService&lt;/span&gt;()) {
            sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;register&lt;/span&gt;(watchService, StandardWatchEventKinds.&lt;span style=&#34;color:#bbb&#34;&gt;ENTRY_MODIFY&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
                WatchKey key = watchService.&lt;span style=&#34;color:#bbb&#34;&gt;take&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (WatchEvent&amp;lt;?&amp;gt; event : key.&lt;span style=&#34;color:#bbb&#34;&gt;pollEvents&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (event.&lt;span style=&#34;color:#bbb&#34;&gt;kind&lt;/span&gt;() == StandardWatchEventKinds.&lt;span style=&#34;color:#bbb&#34;&gt;ENTRY_MODIFY&lt;/span&gt;) {
                        Path changed = sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;((Path) event.&lt;span style=&#34;color:#bbb&#34;&gt;context&lt;/span&gt;());
                        String fileName = changed.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;()
                            .&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (fileName.&lt;span style=&#34;color:#bbb&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.java&amp;#34;&lt;/span&gt;)) {
                            compileAndReload(fileName);
                        }
                    }
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!key.&lt;span style=&#34;color:#bbb&#34;&gt;reset&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                }
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error in file watcher: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compileAndReload&lt;/span&gt;(String fileName) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            String className = fileName.&lt;span style=&#34;color:#bbb&#34;&gt;replace&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
            Path sourceFile = sourceDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(fileName);
            Path classFile = classDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(className + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.class&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if the file has been modified since last compilation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; lastModTime = lastModified.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(className, 0L);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; currentModTime = Files.&lt;span style=&#34;color:#bbb&#34;&gt;getLastModifiedTime&lt;/span&gt;(sourceFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(classFile) &amp;amp;&amp;amp; Files.&lt;span style=&#34;color:#bbb&#34;&gt;getLastModifiedTime&lt;/span&gt;(classFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;() &amp;gt;= currentModTime &amp;amp;&amp;amp; lastModTime &amp;gt;= currentModTime) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
            }

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compile the Java file
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; compilationSuccessful = compile(sourceFile);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (compilationSuccessful) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Compilation successful, reload the class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                reloadClass(className);
                lastModified.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(className, currentModTime);
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Reloaded: &amp;#34;&lt;/span&gt; + className);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Compilation failed for: &amp;#34;&lt;/span&gt; + className);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error in compile and reload: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;compile&lt;/span&gt;(Path sourceFile) {
        DiagnosticCollector&amp;lt;JavaFileObject&amp;gt; diagnostics = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DiagnosticCollector&amp;lt;&amp;gt;();
        Iterable&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; JavaFileObject&amp;gt; compilationUnits = fileManager.&lt;span style=&#34;color:#bbb&#34;&gt;getJavaFileObjectsFromFiles&lt;/span&gt;(Collections.&lt;span style=&#34;color:#bbb&#34;&gt;singletonList&lt;/span&gt;(sourceFile.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;()));

        List&amp;lt;String&amp;gt; options = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;, classDir.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

        JavaCompiler.&lt;span style=&#34;color:#bbb&#34;&gt;CompilationTask&lt;/span&gt; task = compiler.&lt;span style=&#34;color:#bbb&#34;&gt;getTask&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, fileManager, diagnostics, options, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, compilationUnits);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; success = task.&lt;span style=&#34;color:#bbb&#34;&gt;call&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!success) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Diagnostic&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; JavaFileObject&amp;gt; diagnostic : diagnostics.&lt;span style=&#34;color:#bbb&#34;&gt;getDiagnostics&lt;/span&gt;()) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error on line %d in %s%n&amp;#34;&lt;/span&gt;, diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getLineNumber&lt;/span&gt;(), diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getSource&lt;/span&gt;()
                    .&lt;span style=&#34;color:#bbb&#34;&gt;toUri&lt;/span&gt;());
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(diagnostic.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;));
            }
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; success;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;reloadClass&lt;/span&gt;(String className) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Class&amp;lt;?&amp;gt; loadedClass = classLoader.&lt;span style=&#34;color:#bbb&#34;&gt;loadClass&lt;/span&gt;(className);
            Method mainMethod = loadedClass.&lt;span style=&#34;color:#bbb&#34;&gt;getMethod&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;, String[].&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Invoking main method for: &amp;#34;&lt;/span&gt; + className);
            mainMethod.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, (Object) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[0]);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error reloading class &amp;#34;&lt;/span&gt; + className + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomClassLoader&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ClassLoader {

        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Class&amp;lt;?&amp;gt; loadClass(String name) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; ClassNotFoundException {
            Path classFile = classDir.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(name + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.class&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;(classFile)) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] classBytes = Files.&lt;span style=&#34;color:#bbb&#34;&gt;readAllBytes&lt;/span&gt;(classFile);
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; defineClass(name, classBytes, 0, classBytes.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ClassNotFoundException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error loading class &amp;#34;&lt;/span&gt; + name, e);
                }
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;loadClass&lt;/span&gt;(name);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Day84 reloader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Day84(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;C:\\Users\\mohib\\IdeaProjects\\date-time\\src\\main\\java&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;C:\\Users\\mohib\\IdeaProjects\\date-time\\target\\classes&amp;#34;&lt;/span&gt;);
        reloader.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Keep the main thread alive and handle user input
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (BufferedReader reader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InputStreamReader(System.&lt;span style=&#34;color:#bbb&#34;&gt;in&lt;/span&gt;))) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Live reloader is running. Press Enter to exit.&amp;#34;&lt;/span&gt;);
            reader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error reading user input: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exiting live reloader.&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Hot Class Reload in Java offers a powerful way to enhance development productivity by reducing the need for full application restarts. By integrating file watching, dynamic compilation, and custom class loading, developers can achieve a seamless development experience akin to JavaScript&amp;rsquo;s Hot Module Reload.&lt;/p&gt;
&lt;p&gt;Implementing HCR can significantly speed up the development cycle, allowing for rapid testing and iteration. As you integrate this technique into your workflow, you&amp;rsquo;ll find it an invaluable tool for efficient Java development. There are some libraries like JRebel which provides this feature more on that in the next post.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 83: Java Object Cloning: Exploring Shallow and Deep Copy Techniques</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day83/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day83/</id>
    <published>2024-09-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Exploring shallow and deep copying of object in java</summary>
    <content type="html">&lt;p&gt;When working with Java objects, it&amp;rsquo;s crucial to understand how objects can be copied. Objects can be copied either shallowly or deeply, and grasping these concepts is essential when you need to duplicate an object&amp;rsquo;s state without affecting the original object.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explore various methods of creating deep and shallow copies of objects in Java, including some optimized approaches and potential pitfalls to avoid.&lt;/p&gt;
&lt;h3 id=&#34;shallow-copy&#34;&gt;Shallow Copy&lt;/h3&gt;
&lt;p&gt;A shallow copy creates a new object but references the same elements as the original object. In other words, the new object contains copies of the values of the original object&amp;rsquo;s fields, but any references to other objects remain the same.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of creating a shallow copy in Java:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Person&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; List&amp;lt;PhoneNumber&amp;gt; phoneNumbers;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Person&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age, List&amp;lt;PhoneNumber&amp;gt; phoneNumbers) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = age;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phoneNumbers&lt;/span&gt; = phoneNumbers;
    }
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// getters &amp;amp; setters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s see how shallow copying works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;givenPersonObject_whenShallowCopied_thenCopyHasSameDataButDifferentReference&lt;/span&gt;() {
    List&amp;lt;PhoneNumber&amp;gt; phoneNumbers = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
    phoneNumbers.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;123-456-7890&amp;#34;&lt;/span&gt;));

    Person person1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, 30, phoneNumbers);
    Person person2 = DeepCopyUtil.&lt;span style=&#34;color:#bbb&#34;&gt;shallowCopy&lt;/span&gt;(person1);

    assertNotEquals(person1, person2);
    assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, person1.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, person2.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    person2.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Jane Doe&amp;#34;&lt;/span&gt;);
    assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, person1.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    assertNotEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, person2.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());

    person2.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;456-789-0123&amp;#34;&lt;/span&gt;));
    assertEquals(2, person1.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, when we assign &lt;code&gt;person1&lt;/code&gt; to &lt;code&gt;person2&lt;/code&gt;, we&amp;rsquo;re creating a shallow copy. As a result, both &lt;code&gt;person1&lt;/code&gt; and &lt;code&gt;person2&lt;/code&gt; refer to the same &lt;code&gt;Person&lt;/code&gt; object in memory. Modifying the &lt;code&gt;phoneNumbers&lt;/code&gt; property of &lt;code&gt;person2&lt;/code&gt; also affects the &lt;code&gt;phoneNumbers&lt;/code&gt; property of &lt;code&gt;person1&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;shallow-copy-methods&#34;&gt;Shallow Copy Methods&lt;/h3&gt;
&lt;p&gt;There are several ways to create shallow copies in Java:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Object.clone() method&lt;/strong&gt;: Requires implementing the &lt;code&gt;Cloneable&lt;/code&gt; interface.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Person&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Cloneable {
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ... fields and other methods ...
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;clone&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; CloneNotSupportedException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copy Constructor&lt;/strong&gt;: Can be used for shallow copying if it only copies references.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Person&lt;/span&gt;(Person other) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = other.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Shallow copy of reference
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = other.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;does-using-clone-make-a-deep-copy&#34;&gt;Does Using Clone() make a Deep Copy?&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;clone()&lt;/code&gt; method typically creates a shallow copy, not a deep copy. This means that while it creates a new object, it doesn&amp;rsquo;t create new instances of the mutable objects contained within the original object.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example using the &lt;code&gt;Cloneable&lt;/code&gt; interface:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;PersonCloneable&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Cloneable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; List&amp;lt;PhoneNumber&amp;gt; phoneNumbers;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;PersonCloneable&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age, List&amp;lt;PhoneNumber&amp;gt; phoneNumbers) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = age;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phoneNumbers&lt;/span&gt; = phoneNumbers;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; PersonCloneable &lt;span style=&#34;color:#447fcf&#34;&gt;clone&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; CloneNotSupportedException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (PersonCloneable) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Getters &amp;amp; setters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s look at a test to understand it better:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;givenPersonCloneableObject_whenCloned_thenShallowCopyIsCreated&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; CloneNotSupportedException {
    List&amp;lt;PhoneNumber&amp;gt; phoneNumbers = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
    phoneNumbers.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;123-456-7890&amp;#34;&lt;/span&gt;));
    PersonCloneable original = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PersonCloneable(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, 30, phoneNumbers);

    PersonCloneable clone = original.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();

    clone.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Jane Doe&amp;#34;&lt;/span&gt;);
    clone.&lt;span style=&#34;color:#bbb&#34;&gt;setAge&lt;/span&gt;(25);
    clone.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;987-654-3210&amp;#34;&lt;/span&gt;));

    assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, original.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    assertEquals(30, original.&lt;span style=&#34;color:#bbb&#34;&gt;getAge&lt;/span&gt;());

    assertEquals(2, original.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
    assertEquals(2, clone.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we use the &lt;code&gt;clone()&lt;/code&gt; method to create a shallow copy of the &lt;code&gt;PersonCloneable&lt;/code&gt; object. This creates a new &lt;code&gt;PersonCloneable&lt;/code&gt; object with its own memory location, independent of the original &lt;code&gt;person1&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;However, modifying the &lt;code&gt;phoneNumbers&lt;/code&gt; property of the clone affects the &lt;code&gt;phoneNumbers&lt;/code&gt; of the original. That&amp;rsquo;s one of the potential issues of using &lt;code&gt;clone()&lt;/code&gt;, as it makes shallow copies, not deep copies.&lt;/p&gt;
&lt;h3 id=&#34;potential-issues-with-clone&#34;&gt;Potential Issues with Clone()&lt;/h3&gt;
&lt;p&gt;While the &lt;code&gt;clone()&lt;/code&gt; method can be used to create copies of objects, it has some significant issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Needs Cloneable interface&lt;/strong&gt;: To use the &lt;code&gt;clone()&lt;/code&gt; method, a class must explicitly implement the &lt;code&gt;Cloneable&lt;/code&gt; interface. By default, the &lt;code&gt;clone()&lt;/code&gt; method is protected in the &lt;code&gt;Object&lt;/code&gt; class, and if a class doesn&amp;rsquo;t implement it, trying to use &lt;code&gt;clone()&lt;/code&gt; will result in a &lt;code&gt;CloneNotSupportedException&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Default Shallow Copy&lt;/strong&gt;: The default &lt;code&gt;clone()&lt;/code&gt; method in the &lt;code&gt;Object&lt;/code&gt; class creates a shallow copy. This means that if the object contains references to other mutable objects, the cloned object will still share those references with the original, rather than duplicating the referenced objects themselves.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security Concerns&lt;/strong&gt;: Overriding the &lt;code&gt;clone()&lt;/code&gt; method allows for custom cloning behavior, but it also introduces potential security risks. Here&amp;rsquo;s a more detailed explanation:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Imagine you&amp;rsquo;re at a copy machine in an office. You&amp;rsquo;re supposed to make an exact copy of a document, but someone has tampered with the machine. Instead of making a true copy, it might add or remove pages, or even worse, send a copy to someone else! That&amp;rsquo;s similar to what can happen with the &lt;code&gt;clone()&lt;/code&gt; method if it&amp;rsquo;s not implemented correctly.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unexpected Behavior&lt;/strong&gt;: When you override &lt;code&gt;clone()&lt;/code&gt;, you&amp;rsquo;re in charge of deciding exactly how the copying happens. If you&amp;rsquo;re not careful, you might accidentally expose private data or create inconsistent objects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The &amp;ldquo;Fake Copy&amp;rdquo; Problem&lt;/strong&gt;: A malicious subclass could override &lt;code&gt;clone()&lt;/code&gt; to return a reference to itself instead of creating a new object. This could trick other parts of the code into thinking they have a fresh copy when they don&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bypassing Security Checks&lt;/strong&gt;: Normally, when you create an object, its constructor runs and can perform important security checks. But &lt;code&gt;clone()&lt;/code&gt; bypasses the constructor, potentially creating objects in an insecure state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inconsistent State&lt;/strong&gt;: If &lt;code&gt;clone()&lt;/code&gt; is interrupted (like by an exception), it might leave the new object half-created. This could lead to bugs or vulnerabilities if the code isn&amp;rsquo;t prepared to handle partially-cloned objects.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s a simple example to illustrate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SecretKeeper&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Cloneable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String secretPassword = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; SecretKeeper &lt;span style=&#34;color:#447fcf&#34;&gt;clone&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            SecretKeeper cloned = (SecretKeeper) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Oops! We forgot to create a new String for secretPassword
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Now the clone shares the same String reference as the original
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; cloned;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (CloneNotSupportedException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;changePassword&lt;/span&gt;(String newPassword) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;secretPassword&lt;/span&gt; = newPassword;
    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// In some other part of the code...
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;SecretKeeper original = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SecretKeeper();
SecretKeeper cloned = original.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// The programmer thinks this only changes the clone&amp;#39;s password
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;cloned.&lt;span style=&#34;color:#bbb&#34;&gt;changePassword&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;5678&amp;#34;&lt;/span&gt;);

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// But surprise! It changed the original&amp;#39;s password too
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// because both objects are sharing the same String reference
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, a programmer using the &lt;code&gt;SecretKeeper&lt;/code&gt; class might think they&amp;rsquo;re safely changing only the cloned object&amp;rsquo;s password, but they&amp;rsquo;re actually changing the original object&amp;rsquo;s password too. This could lead to serious security issues in a real application.&lt;/p&gt;
&lt;p&gt;To avoid these pitfalls, many Java developers prefer to use copy constructors or factory methods for object copying. These approaches give you more control and make it easier to ensure that you&amp;rsquo;re creating secure, consistent copies of objects.&lt;/p&gt;
&lt;h3 id=&#34;deep-copy-methods&#34;&gt;Deep Copy Methods&lt;/h3&gt;
&lt;p&gt;To perform a deep copy in Java, we have multiple options such as using a custom copy method or a copy constructor. Furthermore, we can leverage serialization and third-party libraries for this purpose. Below, we&amp;rsquo;ll discuss deep copy methods including custom copy methods and serialization.&lt;/p&gt;
&lt;h4 id=&#34;custom-copy-method&#34;&gt;Custom Copy Method&lt;/h4&gt;
&lt;p&gt;One way to create a deep copy is to manually create new instances of all mutable objects. Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Person &lt;span style=&#34;color:#447fcf&#34;&gt;deepCopy&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt;), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;serialization&#34;&gt;Serialization&lt;/h4&gt;
&lt;p&gt;Java serialization is one of the most efficient ways of creating deep copies of an object. This approach works well for serializable objects (those that implement the &lt;code&gt;Serializable&lt;/code&gt; interface). Using third-party libraries like Jackson and Gson, you can also do this.&lt;/p&gt;
&lt;p&gt;For example, let&amp;rsquo;s modify the &lt;code&gt;Person&lt;/code&gt; class to make it serializable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;PersonSerializable&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Serializable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; List&amp;lt;PhoneNumber&amp;gt; phoneNumbers;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;PersonSerializable&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age, List&amp;lt;PhoneNumber&amp;gt; phoneNumbers) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = age;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phoneNumbers&lt;/span&gt; = phoneNumbers;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now our custom &lt;code&gt;deepCopy()&lt;/code&gt; method will use serialization-deserialization to copy an object:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; Serializable&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;deepCopy&lt;/span&gt;(T object) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        ByteArrayOutputStream baos = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ByteArrayOutputStream();
        ObjectOutputStream oos = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectOutputStream(baos);
        oos.&lt;span style=&#34;color:#bbb&#34;&gt;writeObject&lt;/span&gt;(object);
        ObjectInputStream ois = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectInputStream(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ByteArrayInputStream(baos.&lt;span style=&#34;color:#bbb&#34;&gt;toByteArray&lt;/span&gt;()));
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (T) ois.&lt;span style=&#34;color:#bbb&#34;&gt;readObject&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | ClassNotFoundException e) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; IllegalArgumentException(e);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here we are making deep copies of an object by serializing it into a byte array and then deserializing it from that byte array. This approach works well for creating a deep copy but requires that all objects in the graph are &lt;code&gt;Serializable&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s see its use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;givenPersonSerializableObject_whenDeepCopied_thenCopyIsIndependentOfOriginal&lt;/span&gt;() {
    List&amp;lt;PhoneNumber&amp;gt; phoneNumbers = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
    phoneNumbers.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;123-456-7890&amp;#34;&lt;/span&gt;));
    PersonSerializable original = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PersonSerializable(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, 30, phoneNumbers);
    PersonSerializable copy = DeepCopyUtil.&lt;span style=&#34;color:#bbb&#34;&gt;deepCopy&lt;/span&gt;(original);

    assertNotSame(original, copy);
    assertEquals(original.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), copy.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    assertEquals(original.&lt;span style=&#34;color:#bbb&#34;&gt;getAge&lt;/span&gt;(), copy.&lt;span style=&#34;color:#bbb&#34;&gt;getAge&lt;/span&gt;());

    copy.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Jane Doe&amp;#34;&lt;/span&gt;);
    copy.&lt;span style=&#34;color:#bbb&#34;&gt;setAge&lt;/span&gt;(25);
    copy.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PhoneNumber(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;987-654-3210&amp;#34;&lt;/span&gt;));

    assertEquals(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;, original.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    assertEquals(30, original.&lt;span style=&#34;color:#bbb&#34;&gt;getAge&lt;/span&gt;());

    assertEquals(1, original.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
    assertEquals(2, copy.&lt;span style=&#34;color:#bbb&#34;&gt;getPhoneNumbers&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This method serializes the object to a byte array and then deserializes it to create a new instance. From the test, we can see that it can effectively create a deep copy of the &lt;code&gt;PersonSerializable&lt;/code&gt; object.&lt;/p&gt;
&lt;h4 id=&#34;other-deep-copy-methods&#34;&gt;Other Deep Copy Methods&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JSON Serialization/Deserialization&lt;/strong&gt;: Use libraries like Jackson or Gson.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;ObjectMapper mapper = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectMapper();
Person copy = mapper.&lt;span style=&#34;color:#bbb&#34;&gt;readValue&lt;/span&gt;(mapper.&lt;span style=&#34;color:#bbb&#34;&gt;writeValueAsString&lt;/span&gt;(original), Person.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloning Libraries&lt;/strong&gt;: Use third-party libraries like Apache Commons Lang.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Person copy = SerializationUtils.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;(original);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Using Reflection&lt;/strong&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Another powerful technique for creating deep copies is using reflection. This method allows you to create a deep copy of an object without the need for implementing &lt;code&gt;Cloneable&lt;/code&gt; or writing custom constructors. It works by recursively copying the fields of an object, even if the fields are private or inaccessible.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of how to implement deep copying using reflection:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.reflect.Field&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.HashMap&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DeepCopyUtil&lt;/span&gt; {

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// A map to track objects and their deep copies to handle cyclic dependencies
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;Object, Object&amp;gt; visited = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;deepCopy&lt;/span&gt;(Object object) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IllegalAccessException, InstantiationException {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if the object is already copied (to handle cyclic dependencies)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (visited.&lt;span style=&#34;color:#bbb&#34;&gt;containsKey&lt;/span&gt;(object)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; visited.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(object); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Return the already-copied object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// If the object is null, no need to copy
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (object == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }

        Class&amp;lt;?&amp;gt; clazz = object.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;();
        Object copy = clazz.&lt;span style=&#34;color:#bbb&#34;&gt;newInstance&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create a new instance of the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        visited.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(object, copy); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Register the object and its copy in the map
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Copy each field of the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Field field : clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredFields&lt;/span&gt;()) {
            field.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            Object value = field.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(object);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Check if a deep copy is required
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (value != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; isDeepCopyRequired(value)) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Recursively copy the field, ensuring cyclic dependencies are handled
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                field.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(copy, deepCopy(value));
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Directly copy the field if it&amp;#39;s a primitive, string, or number
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                field.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(copy, value);
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; copy;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isDeepCopyRequired&lt;/span&gt;(Object value) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; !(value.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;isPrimitive&lt;/span&gt;() || value &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; String || value &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; Number);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;clearVisitedMap&lt;/span&gt;() {
        visited.&lt;span style=&#34;color:#bbb&#34;&gt;clear&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Clear the map after deep copying to avoid memory leaks
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This method works by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creating a new instance of the object&amp;rsquo;s class.&lt;/li&gt;
&lt;li&gt;Iterating through all declared fields of the object.&lt;/li&gt;
&lt;li&gt;For each field, if it&amp;rsquo;s not a primitive, String, or Number (which are immutable), it recursively applies the deep copy method.
Otherwise, it simply copies the value. Here the method might produce cyclic dependencies which can be resolved by checking if we already created the object. Thats why we have a &lt;code&gt;visited&lt;/code&gt; map in the example to resolve that.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s see how we can use this method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Person&lt;/span&gt; {
    String name;
    Person friend; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Cyclic reference possible
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Person&lt;/span&gt;(String name) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
    }
}

&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testDeepCopyWithCyclicDependency&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
    Person john = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John&amp;#34;&lt;/span&gt;);
    Person jane = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Jane&amp;#34;&lt;/span&gt;);

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create cyclic dependency
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    john.&lt;span style=&#34;color:#bbb&#34;&gt;friend&lt;/span&gt; = jane;
    jane.&lt;span style=&#34;color:#bbb&#34;&gt;friend&lt;/span&gt; = john;

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Deep copy the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    Person johnCopy = (Person) DeepCopyUtil.&lt;span style=&#34;color:#bbb&#34;&gt;deepCopy&lt;/span&gt;(john);

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Ensure deep copy is successful and cyclic references are handled
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    Assertions.&lt;span style=&#34;color:#bbb&#34;&gt;assertNotSame&lt;/span&gt;(john, johnCopy);
    Assertions.&lt;span style=&#34;color:#bbb&#34;&gt;assertNotSame&lt;/span&gt;(jane, johnCopy.&lt;span style=&#34;color:#bbb&#34;&gt;friend&lt;/span&gt;);
    Assertions.&lt;span style=&#34;color:#bbb&#34;&gt;assertSame&lt;/span&gt;(johnCopy, johnCopy.&lt;span style=&#34;color:#bbb&#34;&gt;friend&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;friend&lt;/span&gt;);

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Clear the visited map to avoid memory leak
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    DeepCopyUtil.&lt;span style=&#34;color:#bbb&#34;&gt;clearVisitedMap&lt;/span&gt;();
}

&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This reflection-based deep copying technique has several advantages and disadvantages:&lt;/p&gt;
&lt;h5 id=&#34;pros&#34;&gt;Pros:&lt;/h5&gt;
&lt;p&gt;It works without modifying your class or implementing interfaces.
It can copy private and protected fields.
It&amp;rsquo;s a generic solution that can work with any object.&lt;/p&gt;
&lt;h5 id=&#34;cons&#34;&gt;Cons:&lt;/h5&gt;
&lt;p&gt;This approach can be slower due to the use of reflection.
It might require handling some special cases, such as cyclic dependencies.
It may not work correctly with final fields or certain complex objects.&lt;/p&gt;
&lt;p&gt;When using this method, be aware of its limitations and test thoroughly with your specific object structures. Also, consider the performance implications, especially when dealing with large object graphs or in performance-critical sections of your code.&lt;/p&gt;
&lt;h3 id=&#34;optimized-approaches&#34;&gt;Optimized Approaches&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copy-on-Write&lt;/strong&gt;: For collections, Java provides copy-on-write implementations like &lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;CopyOnWriteArrayList&amp;lt;Person&amp;gt; list = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CopyOnWriteArrayList&amp;lt;&amp;gt;();
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Adding elements doesn&amp;#39;t create a copy
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;list.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;John&amp;#34;&lt;/span&gt;, 30));
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// But modifying operations do
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;list.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(0, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Jane&amp;#34;&lt;/span&gt;, 28));
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Immutable Objects&lt;/strong&gt;: If objects are immutable, shallow copying is effectively the same as deep copying.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ImmutablePerson&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ImmutablePerson&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = age;
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Only getters, no setters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lazy Copying&lt;/strong&gt;: Implement a copy-on-write mechanism for individual fields.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;LazyPerson&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; LazyPerson original;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;LazyPerson&lt;/span&gt;(String name, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; age) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = age;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;LazyPerson&lt;/span&gt;(LazyPerson other) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;original&lt;/span&gt; = other;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getName&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (original != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; original.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; name;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setName&lt;/span&gt;(String name) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (original != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = original.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt; = original.&lt;span style=&#34;color:#bbb&#34;&gt;age&lt;/span&gt;;
            original = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Similar for age
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;In this article, we&amp;rsquo;ve covered what shallow and deep copy means in Java. Shallow copies create new objects but maintain references to the same nested objects, while deep copies create entirely new objects with independent states, including nested objects.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve explored various methods for creating both shallow and deep copies, including the &lt;code&gt;clone()&lt;/code&gt; method, custom copy methods, serialization, and some optimized approaches. We&amp;rsquo;ve also discussed the potential security issues with using &lt;code&gt;clone()&lt;/code&gt; and why many developers prefer alternative methods.&lt;/p&gt;
&lt;p&gt;When choosing a copying method, consider the specific requirements of your application, including performance needs, object complexity, and maintenance considerations. Always profile your application to determine the most efficient method for your specific scenario.&lt;/p&gt;
&lt;p&gt;Remember, the &amp;ldquo;best&amp;rdquo; approach often depends on the specific requirements of your application. Shallow copying might be sufficient for simple objects or when performance is critical, while deep copying is necessary when you need to create truly independent copies of complex object graphs.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 82: Reflection in Java: Building a Simple DI Container in 100 Lines of Code</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day82/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day82/</id>
    <published>2024-08-17T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">making a minimal spring like java dependency injection container using java reflection and annotation api</summary>
    <content type="html">&lt;p&gt;Reflection in Java is a powerful concept that serves as the backbone for numerous Java and J2EE frameworks [1]. This feature allows an executing Java program to examine or &lt;strong&gt;introspect&lt;/strong&gt; upon itself, and manipulate its internal properties at runtime [2]. While it&amp;rsquo;s of limited use in everyday programming, reflection plays a crucial role in various frameworks that lack direct access to user-defined classes, interfaces, and their methods.&lt;/p&gt;
&lt;h3 id=&#34;what-is-this-introspect&#34;&gt;What is this introspect&lt;/h3&gt;
&lt;p&gt;Imagine giving a program a magic mirror that lets it see and understand itself. That&amp;rsquo;s what introspection does in Java. It&amp;rsquo;s like the code is able to figure out what it is and what it can do, all while it&amp;rsquo;s running.&lt;/p&gt;
&lt;p&gt;This self-examination superpower is super handy. It helps debuggers peek inside code, powers those handy autocompletions in your IDE, and even helps convert data between different formats. It&amp;rsquo;s all thanks to some clever Java tools that let programs ask themselves questions like &amp;ldquo;What am I?&amp;rdquo; or &amp;ldquo;What can I do?&amp;rdquo;
While it&amp;rsquo;s a cool trick, it needs to be used carefully. Overdo it, and your program might slow down or accidentally reveal things meant to be secret. But when used right, it&amp;rsquo;s like giving your code X-ray vision – a powerful tool that opens up a world of possibilities for flexible, dynamic programming.&lt;/p&gt;
&lt;h3 id=&#34;understanding-reflection-api&#34;&gt;Understanding Reflection API&lt;/h3&gt;
&lt;p&gt;The Reflection API provides developers with the ability to analyze and modify class fields and methods during runtime [1]. It offers several methods to examine Class fields, invoke methods, and create new instances of classes by invoking constructors [1]. To use reflection, developers typically follow three steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Obtain a &lt;code&gt;java.lang.Class&lt;/code&gt; object for the class to manipulate.&lt;/li&gt;
&lt;li&gt;Use the Class object to gather information about the class.&lt;/li&gt;
&lt;li&gt;Utilize reflection classes like Method from &lt;code&gt;java.lang.reflect&lt;/code&gt; to perform operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One practical application of reflection is in JavaBeans, where software components can be manipulated visually via builder tools [2]. These tools use reflection to obtain the properties of Java components as they are dynamically loaded. Reflections another practical application&lt;/p&gt;
&lt;h3 id=&#34;reflection-for-runtime-type-introspection&#34;&gt;Reflection for Runtime Type Introspection&lt;/h3&gt;
&lt;p&gt;Reflection enables runtime type introspection, allowing programs to examine and interact with objects whose types may not be known at compile time. This capability is particularly useful in scenarios where dynamic behavior is required.&lt;/p&gt;
&lt;p&gt;For instance, reflection can be used to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simulate the instanceof operator using Class.isInstance method [2].&lt;/li&gt;
&lt;li&gt;Discover methods defined within a class [2].&lt;/li&gt;
&lt;li&gt;Examine constructors and data fields of a class [2].&lt;/li&gt;
&lt;li&gt;Invoke methods dynamically, even when the method name is specified during execution [2].&lt;/li&gt;
&lt;li&gt;Modify values of data fields in objects at runtime [2].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These capabilities make reflection a powerful tool for creating flexible and adaptable software systems. However, it&amp;rsquo;s important to use reflection judiciously, as it can impact performance and potentially break encapsulation principles.&lt;/p&gt;
&lt;h3 id=&#34;security-considerations-with-reflection&#34;&gt;Security Considerations with Reflection&lt;/h3&gt;
&lt;p&gt;While reflection offers significant flexibility, it also introduces security considerations that developers must address:
Potential for Code Injection: Unsafe use of reflection mechanisms can create unexpected control flow paths through an application, potentially bypassing security checks [3]. This vulnerability may allow attackers to create limited forms of code injection.&lt;/p&gt;
&lt;h3 id=&#34;access-control-risks&#34;&gt;Access Control Risks:&lt;/h3&gt;
&lt;p&gt;Reflection can be used to access private fields and methods, potentially breaking encapsulation and leaking sensitive data [4]. This capability can lead to various malicious exploits, such as modifying supposedly immutable strings or revealing sensitive information from objects [4].&lt;/p&gt;
&lt;h3 id=&#34;classloader-hierarchy-concerns&#34;&gt;Classloader Hierarchy Concerns:&lt;/h3&gt;
&lt;p&gt;In shared hosting environments like Google App Engine, reflection could potentially be used to enumerate classes and methods from different users&#39; WAR files if not properly restricted [4].&lt;/p&gt;
&lt;p&gt;To mitigate these risks, developers should consider the following precautions:&lt;/p&gt;
&lt;h4 id=&#34;install-and-configure-a-securitymanager-to-enforce-access-controls&#34;&gt;Install and configure a SecurityManager to enforce access controls&lt;/h4&gt;
&lt;p&gt;Use the setAccessible() method judiciously, as it&amp;rsquo;s subject to security checks governed by the setAccessChecks reflection permission [4].
Be cautious when using reflection to instantiate objects or invoke methods, especially with user-supplied input [3].
By understanding both the power and the potential risks of reflection, developers can leverage this feature effectively while maintaining the security and integrity of their applications.&lt;/p&gt;
&lt;h3 id=&#34;exploring-dependency-injection-patterns&#34;&gt;Exploring Dependency Injection Patterns&lt;/h3&gt;
&lt;p&gt;Dependency Injection (DI) is a design pattern in Java that aims to decouple classes from their dependencies, making code more flexible, testable, and maintainable [5]. It allows developers to move the dependency resolution from compile-time to runtime, resulting in loosely coupled and extendable applications [6]. There are several patterns for implementing dependency injection in Java, each with its own advantages and use cases.&lt;/p&gt;
&lt;h4 id=&#34;constructor-injection&#34;&gt;Constructor Injection&lt;/h4&gt;
&lt;p&gt;Constructor injection involves passing dependencies as arguments to a class&amp;rsquo;s constructor. This method ensures that all required dependencies are available upon object creation, making it ideal for mandatory dependencies [5]. Constructor injection supports immutability and state safety, as the object is either instantiated with a full state or not instantiated at all [7].&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Car&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Engine engine;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Steering steering;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Autowired&lt;/span&gt; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Spring like
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ffa500&#34;&gt;@inject&lt;/span&gt; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//JAX-RS
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Car&lt;/span&gt;(Engine engine, Steering steering) {
        thisותs.&lt;span style=&#34;color:#bbb&#34;&gt;engine&lt;/span&gt; = engine;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;steering&lt;/span&gt; = steering;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This pattern is particularly useful when dealing with components that are essential for an object&amp;rsquo;s functionality, such as a car needing an engine and steering [8].&lt;/p&gt;
&lt;h4 id=&#34;setter-injection&#34;&gt;Setter Injection&lt;/h4&gt;
&lt;p&gt;Setter injection utilizes setter methods to inject dependencies after object creation. This approach offers more flexibility but can make the class mutable [5]. It&amp;rsquo;s preferred for optional dependencies that are not mandatorily required but can assist in some ways [8].&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;User&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String phoneNumber;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setPhoneNumber&lt;/span&gt;(String phoneNumber) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;phoneNumber&lt;/span&gt; = phoneNumber;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Setter injection is suitable for scenarios where dependencies may change during the object&amp;rsquo;s lifecycle or when dealing with optional components [7].&lt;/p&gt;
&lt;h3 id=&#34;method-injection&#34;&gt;Method Injection&lt;/h3&gt;
&lt;p&gt;Method injection involves injecting dependencies directly into methods where they are needed. This pattern is less common but can be useful in specific scenarios where dependencies are required only for certain operations.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MessageSender&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sendMessage&lt;/span&gt;(MessageService messageService, String message) {
        messageService.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(message);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;field-injection&#34;&gt;Field Injection&lt;/h3&gt;
&lt;p&gt;Field injection directly injects dependencies into class fields, typically using annotations. While it results in less boilerplate code and can improve readability, it doesn&amp;rsquo;t support immutability and can make testing more challenging [7].&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EmailService&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; EmailClient emailClient;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When choosing a dependency injection pattern, developers should consider factors such as immutability, state safety, and the nature of the dependencies (mandatory vs. optional). Constructor injection is generally recommended for its support of immutability and clear dependency declaration, while setter injection offers more flexibility for optional dependencies [7].&lt;/p&gt;
&lt;p&gt;To implement these patterns effectively, developers can use frameworks like Spring, which provide powerful dependency injection containers. These containers manage the creation and injection of dependencies, inverting the control flow and allowing for more modular and maintainable code [5].&lt;/p&gt;
&lt;h2 id=&#34;designing-a-lightweight-di-container&#34;&gt;Designing a Lightweight DI Container&lt;/h2&gt;
&lt;p&gt;Designing a lightweight Dependency Injection (DI) container involves creating a framework that manages the creation and lifecycle of objects in an application. This approach allows developers to implement Inversion of Control (IoC), a design principle that separates the responsibility of creating and managing dependencies from the client classes [9]. A well-designed DI container enhances modularity, reusability, and testability of code by promoting loose coupling between components [10].&lt;/p&gt;
&lt;h3 id=&#34;container-initialization&#34;&gt;Container Initialization&lt;/h3&gt;
&lt;p&gt;The first step in designing a lightweight DI container is to create an initialization mechanism. This process typically involves:
Defining an &lt;code&gt;AbstractBinder&lt;/code&gt; or similar class to specify how dependencies should be created and managed [11].
Registering the binder with the application, often through a configuration file or programmatically [11].
Implementing a class that extends a framework-specific class (e.g., ResourceConfig in JAX-RS) to register the binder and specify the packages to scan for injectable components [11].&lt;/p&gt;
&lt;p&gt;For example, in a JAX-RS application, the initialization might look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyApplication&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ResourceConfig {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;MyApplication&lt;/span&gt;() {
        register(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; MyApplicationBinder());
        packages(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;com.mypackage.rest&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This initialization sets up the container to manage dependencies within the specified package and its subpackages.&lt;/p&gt;
&lt;h3 id=&#34;dependency-scanning-and-registration&#34;&gt;Dependency Scanning and Registration&lt;/h3&gt;
&lt;p&gt;Once the container is initialized, it needs to scan for and register dependencies. This process involves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scanning all clients under the root package and subpackages [9].&lt;/li&gt;
&lt;li&gt;Creating instances of client classes [9].&lt;/li&gt;
&lt;li&gt;Identifying services used in client classes, including member variables, constructor parameters, and method parameters [9].&lt;/li&gt;
&lt;li&gt;Recursively scanning for nested dependencies within services [9].&lt;/li&gt;
&lt;li&gt;Creating a map of all client classes and their dependencies [9].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During this phase, the container should also handle special cases, such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Validating if there are multiple implementations of an interface or no implementation at all [9].&lt;/li&gt;
&lt;li&gt;Managing qualifiers for services or implementing autowiring by type when multiple implementations exist [9].&lt;/li&gt;
&lt;li&gt;Resolving and Injecting Dependencies&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The final step in the DI process is resolving and injecting dependencies. This involves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating instances of services identified during the scanning phase [9].&lt;/li&gt;
&lt;li&gt;Injecting (initializing) each service with its required dependencies [9].&lt;/li&gt;
&lt;li&gt;Providing methods to retrieve beans or services, such as getBean(Class classz) or getService(Class classz) [9].&lt;/li&gt;
&lt;li&gt;The injection process follows a specific order as defined by JSR330 [12]:
&lt;ol&gt;
&lt;li&gt;Constructor injection
2.Field injection
3.Method injection&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s important to note that the order in which methods or fields annotated with @Inject are called is not defined by &lt;code&gt;JSR330&lt;/code&gt;, so developers should not assume a specific order of injection [12].
To implement this lightweight DI container, developers can use annotations like @Inject to mark injection points [13]. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Payroll&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; EmployeeDatabase employeeDatabase;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Inject&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Payroll&lt;/span&gt;(EmployeeDatabase employeeDatabase) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;employeeDatabase&lt;/span&gt; = employeeDatabase;
    }
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// ... rest of the class implementation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This design allows for flexible configuration and easy testing, as dependencies can be easily mocked or stubbed [10]. It also promotes the use of immutable objects and makes dependencies explicit, which enhances code maintainability [10].
By implementing these components, developers can create a lightweight DI container that provides the benefits of dependency injection without the complexity of larger frameworks. This approach is particularly useful for standalone Java applications or when retrofitting legacy systems as part of major refactoring efforts [14].&lt;/p&gt;
&lt;p&gt;Now lets implement a DI container&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1723901217/images-from-blog/simple-dependency-injection_ycnmlt.png&#34; alt=&#34;day82-DIContainer&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;At first we will see how the container is made up and then will create the services and load them in the container and use them to see.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;80
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;DIContainer&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt; singletons = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConcurrentHashMap&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;Class&amp;lt;?&amp;gt;, Class&amp;lt;?&amp;gt;&amp;gt; implementations = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConcurrentHashMap&amp;lt;&amp;gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &amp;lt;T&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;bindImplementation&lt;/span&gt;(Class&amp;lt;T&amp;gt; interfaceClass, Class&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; T&amp;gt; implementationClass) {
        implementations.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(interfaceClass, implementationClass);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;(Class&amp;lt;T&amp;gt; clazz) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; getOrCreateInstance(clazz);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error creating instance of &amp;#34;&lt;/span&gt; + clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), e);
        }
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@SuppressWarnings&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unchecked&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;getOrCreateInstance&lt;/span&gt;(Class&amp;lt;T&amp;gt; clazz) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        Class&amp;lt;?&amp;gt; targetClass = implementations.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(clazz, clazz);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (targetClass.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Singleton.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (T) singletons.&lt;span style=&#34;color:#bbb&#34;&gt;computeIfAbsent&lt;/span&gt;(targetClass, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::createInstance);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; createInstance(targetClass);
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@SuppressWarnings&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;unchecked&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;createInstance&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Constructor&amp;lt;?&amp;gt; constructor = findInjectableConstructor(clazz);
            T instance = (T) (constructor != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ?
                    createInstanceWithConstructor(constructor) :
                    clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredConstructor&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;newInstance&lt;/span&gt;());

            injectFields(clazz, instance);
            injectMethods(clazz, instance);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error creating instance of &amp;#34;&lt;/span&gt; + clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), e);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Constructor&amp;lt;?&amp;gt; findInjectableConstructor(Class&amp;lt;?&amp;gt; clazz) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredConstructors&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(c -&amp;gt; c.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;))
                .&lt;span style=&#34;color:#bbb&#34;&gt;findFirst&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;orElse&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;createInstanceWithConstructor&lt;/span&gt;(Constructor&amp;lt;?&amp;gt; constructor) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        Object[] params = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(constructor.&lt;span style=&#34;color:#bbb&#34;&gt;getParameterTypes&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::getInstance)
                .&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; constructor.&lt;span style=&#34;color:#bbb&#34;&gt;newInstance&lt;/span&gt;(params);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;injectFields&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz, Object instance) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Field field : clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredFields&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (field.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
                Object fieldInstance = getInstance(field.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;());
                field.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
                field.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(instance, fieldInstance);
            }
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;injectMethods&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz, Object instance) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Method method : clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredMethods&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (method.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
                Object[] params = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(method.&lt;span style=&#34;color:#bbb&#34;&gt;getParameterTypes&lt;/span&gt;())
                        .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::getInstance)
                        .&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;();
                method.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
                method.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(instance, params);
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now let us break this class down. The DIContainer class is the core of our DI framework. It uses two main data structures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;singletons: A thread-safe map to store singleton instances&lt;/li&gt;
&lt;li&gt;implementations: A map to store interface-to-implementation bindings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use annotations and reflection to make the core features of the DI.&lt;/p&gt;
&lt;p&gt;The bindImplementation method allows users to specify which implementation should be used for a given interface: This is useful when you want to inject an interface but use a specific implementation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &amp;lt;T&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;bindImplementation&lt;/span&gt;(Class&amp;lt;T&amp;gt; interfaceClass, Class&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; T&amp;gt; implementationClass) {
    implementations.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(interfaceClass, implementationClass);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The public getInstance method is the entry point for retrieving instances: It delegates to getOrCreateInstance, wrapping any exceptions in a RuntimeException.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;(Class&amp;lt;T&amp;gt; clazz) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; getOrCreateInstance(clazz);
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error creating instance of &amp;#34;&lt;/span&gt; + clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), e);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The getOrCreateInstance method is where the magic happens: It first checks if there&amp;rsquo;s a registered implementation for the requested class. If the target class is annotated with @Singleton, it uses computeIfAbsent to ensure thread-safe lazy initialization. Otherwise, it creates a new instance each time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;getOrCreateInstance&lt;/span&gt;(Class&amp;lt;T&amp;gt; clazz) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
    Class&amp;lt;?&amp;gt; targetClass = implementations.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(clazz, clazz);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (targetClass.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Singleton.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (T) singletons.&lt;span style=&#34;color:#bbb&#34;&gt;computeIfAbsent&lt;/span&gt;(targetClass, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::createInstance);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; createInstance(targetClass);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The createInstance method handles the actual object creation: It performs these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find an @Inject-annotated constructor&lt;/li&gt;
&lt;li&gt;Create the instance using the constructor or default constructor&lt;/li&gt;
&lt;li&gt;Inject fields&lt;/li&gt;
&lt;li&gt;Inject methods&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;createInstance&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        Constructor&amp;lt;?&amp;gt; constructor = findInjectableConstructor(clazz);
        T instance = (T) (constructor != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ?
                createInstanceWithConstructor(constructor) :
                clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredConstructor&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;newInstance&lt;/span&gt;());

        injectFields(clazz, instance);
        injectMethods(clazz, instance);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error creating instance of &amp;#34;&lt;/span&gt; + clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(), e);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;constructor-injection-1&#34;&gt;Constructor Injection&lt;/h3&gt;
&lt;p&gt;findInjectableConstructor looks for a constructor annotated with @Inject: If found, createInstanceWithConstructor handles the dependency injection: This method searches for a constructor annotated with @Inject. Here&amp;rsquo;s what&amp;rsquo;s happening:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We get all declared constructors of the class using clazz.getDeclaredConstructors() a reflection method that gets declared constructors.&lt;/li&gt;
&lt;li&gt;We create a stream from this array of constructors&lt;/li&gt;
&lt;li&gt;We filter the stream to keep only constructors annotated with @Inject&lt;/li&gt;
&lt;li&gt;We take the first matching constructor (findFirst())&lt;/li&gt;
&lt;li&gt;If no constructor is found, we return null (orElse(null))&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach allows us to specify which constructor should be used for dependency injection. If no @Inject-annotated constructor is found, we&amp;rsquo;ll fall back to using the default constructor.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Constructor&amp;lt;?&amp;gt; findInjectableConstructor(Class&amp;lt;?&amp;gt; clazz) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredConstructors&lt;/span&gt;())
            .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(c -&amp;gt; c.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;))
            .&lt;span style=&#34;color:#bbb&#34;&gt;findFirst&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElse&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;createInstanceWithConstructor()&lt;/code&gt; This method creates an instance using the provided constructor. Here&amp;rsquo;s the process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We get the parameter types of the constructor&lt;/li&gt;
&lt;li&gt;We create a stream of these types&lt;/li&gt;
&lt;li&gt;For each type, we call getInstance() to get or create an instance of that type&lt;/li&gt;
&lt;li&gt;We collect these instances into an array
Finally, we invoke the constructor with these parameters.This recursive approach ensures that all dependencies (and their dependencies) are properly instantiated.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;createInstanceWithConstructor&lt;/span&gt;(Constructor&amp;lt;?&amp;gt; constructor) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
    Object[] params = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(constructor.&lt;span style=&#34;color:#bbb&#34;&gt;getParameterTypes&lt;/span&gt;())
            .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::getInstance)
            .&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; constructor.&lt;span style=&#34;color:#bbb&#34;&gt;newInstance&lt;/span&gt;(params);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;field-injection-1&#34;&gt;Field Injection&lt;/h3&gt;
&lt;p&gt;The injectFields method handles field injection:&lt;/p&gt;
&lt;p&gt;We iterate over all declared fields of the class for each field annotated with @Inject&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We get an instance of the field&amp;rsquo;s type using getInstance()&lt;/li&gt;
&lt;li&gt;We make the field accessible (in case it&amp;rsquo;s private)&lt;/li&gt;
&lt;li&gt;We set the field&amp;rsquo;s value on the instance to our newly created fieldInstance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allows for dependency injection on fields, which can be useful for optional dependencies or when constructor injection isn&amp;rsquo;t feasible.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;injectFields&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz, Object instance) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Field field : clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredFields&lt;/span&gt;()) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (field.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
            Object fieldInstance = getInstance(field.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;());
            field.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            field.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(instance, fieldInstance);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;method-injection-1&#34;&gt;Method Injection&lt;/h3&gt;
&lt;p&gt;This method performs method injection: We iterate over all declared methods of the class&lt;/p&gt;
&lt;p&gt;For each method annotated with @Inject:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We get the parameter types of the method&lt;/li&gt;
&lt;li&gt;We create instances for each parameter type using getInstance()&lt;/li&gt;
&lt;li&gt;We make the method accessible&lt;/li&gt;
&lt;li&gt;We invoke the method on the instance with the created parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Method injection can be useful for optional dependencies or for performing post-construction initialization.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;injectMethods&lt;/span&gt;(Class&amp;lt;?&amp;gt; clazz, Object instance) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Method method : clazz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredMethods&lt;/span&gt;()) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (method.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(Inject.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)) {
            Object[] params = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(method.&lt;span style=&#34;color:#bbb&#34;&gt;getParameterTypes&lt;/span&gt;())
                    .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;::getInstance)
                    .&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;();
            method.&lt;span style=&#34;color:#bbb&#34;&gt;setAccessible&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            method.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(instance, params);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This DIContainer implementation provides a flexible and powerful dependency injection framework. It supports constructor, field, and method injection, as well as singleton management and interface-to-implementation binding. The use of reflection allows for a clean and non-invasive way to manage dependencies in your application.&lt;/p&gt;
&lt;p&gt;Now let us see the Main class and how to use it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MessageService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sendMessage&lt;/span&gt;(String message);
}

&lt;span style=&#34;color:#ffa500&#34;&gt;@Singleton&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;EmailService&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; MessageService {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;sendMessage&lt;/span&gt;(String message) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Sending email: &amp;#34;&lt;/span&gt; + message);
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;UserService&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MessageService messageService;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Inject&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;UserService&lt;/span&gt;(MessageService messageService) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;messageService&lt;/span&gt; = messageService;
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;notifyUser&lt;/span&gt;(String message) {
        messageService.&lt;span style=&#34;color:#bbb&#34;&gt;sendMessage&lt;/span&gt;(message);
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Main&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        DIContainer container = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DIContainer();
        container.&lt;span style=&#34;color:#bbb&#34;&gt;bindImplementation&lt;/span&gt;(MessageService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;, EmailService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

        UserService userService = container.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(UserService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        userService.&lt;span style=&#34;color:#bbb&#34;&gt;notifyUser&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello from, DI!&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This example demonstrates a basic Dependency Injection (DI) setup using a custom container:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Component structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MessageService&lt;/code&gt;: An interface defining the contract for messaging.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EmailService&lt;/code&gt;: A concrete &lt;code&gt;@Singleton&lt;/code&gt; implementation of &lt;code&gt;MessageService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserService&lt;/code&gt;: A service with a dependency on &lt;code&gt;MessageService&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DI configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UserService&lt;/code&gt; uses constructor injection, marked with &lt;code&gt;@Inject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The DI container is configured to bind &lt;code&gt;MessageService&lt;/code&gt; to &lt;code&gt;EmailService&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runtime behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;code&gt;DIContainer&lt;/code&gt; instance is created and configured.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;getInstance(UserService.class)&lt;/code&gt; is called, the container:
a. Recognizes the &lt;code&gt;MessageService&lt;/code&gt; dependency.
b. Instantiates &lt;code&gt;EmailService&lt;/code&gt; (or reuses the singleton instance).
c. Injects the &lt;code&gt;EmailService&lt;/code&gt; into &lt;code&gt;UserService&lt;/code&gt;.
d. Returns the constructed &lt;code&gt;UserService&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Key DI principles demonstrated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inversion of Control (IoC): &lt;code&gt;UserService&lt;/code&gt; doesn&amp;rsquo;t create its dependencies.&lt;/li&gt;
&lt;li&gt;Loose coupling: &lt;code&gt;UserService&lt;/code&gt; depends on the &lt;code&gt;MessageService&lt;/code&gt; interface, not the concrete &lt;code&gt;EmailService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Single Responsibility Principle: The DI container manages object creation and wiring.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved testability: Dependencies can be easily mocked.&lt;/li&gt;
&lt;li&gt;Flexibility: Changing implementations (e.g., to an &lt;code&gt;SMSService&lt;/code&gt;) requires only container reconfiguration.&lt;/li&gt;
&lt;li&gt;Separation of concerns: Business logic is separated from object construction and wiring.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setup showcases core DI concepts, illustrating how it promotes loosely coupled, modular, and easily maintainable code architecture.&lt;/p&gt;
&lt;p&gt;To wrap up, reflection in Java proves to be a game-changer for building flexible and adaptable applications. Its ability to enable runtime introspection and modification has a profound impact on the development of frameworks and tools, particularly in the realm of dependency injection. The creation of a lightweight DI container showcases the practical application of reflection, demonstrating how it can be harnessed to implement sophisticated design patterns and improve code modularity.
The exploration of various dependency injection patterns and the design considerations for a DI container highlight the power of reflection to create more maintainable and testable code. By leveraging annotations and reflection, developers can craft systems that are not only more flexible but also easier to extend and modify over time. This approach to software design opens up new possibilities for creating robust and scalable applications, ultimately leading to more efficient development processes and higher-quality software products.&lt;/p&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;p&gt;[1] - &lt;a href=&#34;https://www.digitalocean.com/community/tutorials/java-reflection-example-tutorial&#34;&gt;https://www.digitalocean.com/community/tutorials/java-reflection-example-tutorial&lt;/a&gt;
[2] - &lt;a href=&#34;https://www.oracle.com/technical-resources/articles/java/javareflection.html&#34;&gt;https://www.oracle.com/technical-resources/articles/java/javareflection.html&lt;/a&gt;
[3] - &lt;a href=&#34;https://owasp.org/www-community/vulnerabilities/Unsafe_use_of_Reflection&#34;&gt;https://owasp.org/www-community/vulnerabilities/Unsafe_use_of_Reflection&lt;/a&gt;
[4] - &lt;a href=&#34;https://stackoverflow.com/questions/3002904/what-is-the-security-risk-of-object-reflection&#34;&gt;https://stackoverflow.com/questions/3002904/what-is-the-security-risk-of-object-reflection&lt;/a&gt;
[5] - &lt;a href=&#34;https://www.geeksforgeeks.org/dependency-injection-di-design-pattern/&#34;&gt;https://www.geeksforgeeks.org/dependency-injection-di-design-pattern/&lt;/a&gt;
[6] - &lt;a href=&#34;https://www.digitalocean.com/community/tutorials/java-dependency-injection-design-pattern-example-tutorial&#34;&gt;https://www.digitalocean.com/community/tutorials/java-dependency-injection-design-pattern-example-tutorial&lt;/a&gt;
[7] - &lt;a href=&#34;https://www.javacodegeeks.com/2019/02/field-setter-constructor-injection.html&#34;&gt;https://www.javacodegeeks.com/2019/02/field-setter-constructor-injection.html&lt;/a&gt;
[8] - &lt;a href=&#34;https://www.geeksforgeeks.org/spring-setter-injection-vs-constructor-injection/&#34;&gt;https://www.geeksforgeeks.org/spring-setter-injection-vs-constructor-injection/&lt;/a&gt;
[9] - &lt;a href=&#34;https://dev.to/jjbrt/how-to-create-your-own-dependency-injection-framework-in-java-4eaj&#34;&gt;https://dev.to/jjbrt/how-to-create-your-own-dependency-injection-framework-in-java-4eaj&lt;/a&gt;
[10] - &lt;a href=&#34;https://www.geeksforgeeks.org/what-is-the-best-way-to-inject-dependency-in-java/&#34;&gt;https://www.geeksforgeeks.org/what-is-the-best-way-to-inject-dependency-in-java/&lt;/a&gt;
[11] - &lt;a href=&#34;https://stackoverflow.com/questions/16216759/dependency-injection-with-jersey-2-0&#34;&gt;https://stackoverflow.com/questions/16216759/dependency-injection-with-jersey-2-0&lt;/a&gt;
[12] - &lt;a href=&#34;https://www.vogella.com/tutorials/DependencyInjection/article.html&#34;&gt;https://www.vogella.com/tutorials/DependencyInjection/article.html&lt;/a&gt;
[13] - &lt;a href=&#34;https://www.objc.io/issue-11/dependency-injection-in-java.html&#34;&gt;https://www.objc.io/issue-11/dependency-injection-in-java.html&lt;/a&gt;
[14] - &lt;a href=&#34;https://stackoverflow.com/questions/1333438/is-there-a-simple-framework-allowing-for-dependency-injection-in-a-stand-alone-p&#34;&gt;https://stackoverflow.com/questions/1333438/is-there-a-simple-framework-allowing-for-dependency-injection-in-a-stand-alone-p&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 81: Creating custom stream operations ex: Slide, Shift, Zip and Fold using Spliterator</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day81/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day81/</id>
    <published>2024-07-04T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing Sliding, shifting, Zipping and Folding a Stream by creating it from a custom spliterator</summary>
    <content type="html">&lt;h1 id=&#34;custom-spliterator-in-java-enhancing-stream-operations&#34;&gt;Custom Spliterator in Java: Enhancing Stream Operations&lt;/h1&gt;
&lt;p&gt;In the world of Java development, mastering the Streams API is crucial for efficient data processing. However, there are times when the built-in functionalities fall short of our specific needs. This is where custom Spliterators come into play. In this blog post, we&amp;rsquo;ll explore how to create a custom Spliterator that implements shifting, sliding, zipping, and folding operations on streams, significantly enhancing your data processing capabilities.&lt;/p&gt;
&lt;h2 id=&#34;understanding-spliterators&#34;&gt;Understanding Spliterators&lt;/h2&gt;
&lt;p&gt;Before we dive into the implementation, let&amp;rsquo;s briefly recap what a Spliterator is. Short for &amp;ldquo;splitable iterator,&amp;rdquo; a Spliterator is an object that traverses and partitions elements of a source. It&amp;rsquo;s designed to work seamlessly with the Stream API and supports parallel processing.&lt;/p&gt;
&lt;h2 id=&#34;why-custom-spliterators-matter&#34;&gt;Why Custom Spliterators Matter&lt;/h2&gt;
&lt;p&gt;Custom Spliterators allow us to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Extend stream functionality beyond built-in operations&lt;/li&gt;
&lt;li&gt;Optimize performance for specific data processing patterns&lt;/li&gt;
&lt;li&gt;Combine multiple operations efficiently&lt;/li&gt;
&lt;li&gt;Create reusable, composable stream components&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;implementing-a-custom-spliterator&#34;&gt;Implementing a Custom Spliterator&lt;/h2&gt;
&lt;p&gt;Our &lt;code&gt;CustomSpliterator&lt;/code&gt; class will implement four key operations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Shifting: Cyclically move elements in the stream&lt;/li&gt;
&lt;li&gt;Sliding: Create windows of elements that slide through the stream&lt;/li&gt;
&lt;li&gt;Zipping: Combine elements from two streams&lt;/li&gt;
&lt;li&gt;Folding: Apply a cumulative operation to stream elements&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s break down each operation:&lt;/p&gt;
&lt;h3 id=&#34;1-shift-operation&#34;&gt;1. Shift Operation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shift&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; offset) {
    Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
    Queue&amp;lt;T&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedList&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; offset &amp;amp;&amp;amp; iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;(); i++) {
        queue.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
    }
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;T&amp;gt;(Long.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;, Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; T&amp;gt; action) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                queue.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
                action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(queue.&lt;span style=&#34;color:#bbb&#34;&gt;poll&lt;/span&gt;());
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; !queue.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;() &amp;amp;&amp;amp; queue.&lt;span style=&#34;color:#bbb&#34;&gt;poll&lt;/span&gt;() != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        }
    }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This method shifts the elements in the stream by a specified offset. It uses a queue to hold the shifted elements and advances the stream accordingly.&lt;/p&gt;
&lt;h3 id=&#34;2-slide-operation&#34;&gt;2. Slide Operation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; Stream&amp;lt;List&amp;lt;T&amp;gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;slide&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; windowSize) {
    Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
    Deque&amp;lt;T&amp;gt; deque = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedList&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; windowSize - 1 &amp;amp;&amp;amp; iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;(); i++) {
        deque.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
    }
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;List&amp;lt;T&amp;gt;&amp;gt;(Long.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;, Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; List&amp;lt;T&amp;gt;&amp;gt; action) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                deque.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (deque.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() &amp;gt; windowSize) {
                    deque.&lt;span style=&#34;color:#bbb&#34;&gt;pollFirst&lt;/span&gt;();
                }
                action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;(deque));
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The slide operation creates overlapping windows of elements. It maintains a deque of the current window and slides it through the stream.&lt;/p&gt;
&lt;h3 id=&#34;3-zip-operation&#34;&gt;3. Zip Operation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;A, B&amp;gt; Stream&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;zip&lt;/span&gt;(Stream&amp;lt;A&amp;gt; streamA, Stream&amp;lt;B&amp;gt; streamB) {
    Spliterator&amp;lt;A&amp;gt; spliteratorA = streamA.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;();
    Spliterator&amp;lt;B&amp;gt; spliteratorB = streamB.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;();

    Iterator&amp;lt;A&amp;gt; iteratorA = Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;(spliteratorA);
    Iterator&amp;lt;B&amp;gt; iteratorB = Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;(spliteratorB);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt;(
            Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(spliteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;estimateSize&lt;/span&gt;(), spliteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;estimateSize&lt;/span&gt;()), Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt; action) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;() &amp;amp;&amp;amp; iteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                A a = iteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                B b = iteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;&amp;gt;(a, b));
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
        }
    }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The zip operation combines elements from two streams into pairs. It advances both streams simultaneously, creating pairs until one of the streams is exhausted.&lt;/p&gt;
&lt;h3 id=&#34;4-fold-operation&#34;&gt;4. Fold Operation&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T, R&amp;gt; R &lt;span style=&#34;color:#447fcf&#34;&gt;fold&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, R identity, BiFunction&amp;lt;R, T, R&amp;gt; accumulator) {
    Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
    R result = identity;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
        result = accumulator.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(result, iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
    }
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The fold operation, also known as reduce, applies a cumulative operation to the stream elements. It&amp;rsquo;s a powerful tool for aggregating data.&lt;/p&gt;
&lt;h3 id=&#34;full-code&#34;&gt;Full Code:&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;78
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomSpliterator&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;shift&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; offset) {
        Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
        Queue&amp;lt;T&amp;gt; queue = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; offset &amp;amp;&amp;amp; iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;(); i++) {
            queue.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;T&amp;gt;(Long.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;, Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; T&amp;gt; action) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                    queue.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
                    action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(queue.&lt;span style=&#34;color:#bbb&#34;&gt;poll&lt;/span&gt;());
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; !queue.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;() &amp;amp;&amp;amp; queue.&lt;span style=&#34;color:#bbb&#34;&gt;poll&lt;/span&gt;() != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
            }
        }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; Stream&amp;lt;List&amp;lt;T&amp;gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;slide&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; windowSize) {
        Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
        Deque&amp;lt;T&amp;gt; deque = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LinkedList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; windowSize - 1 &amp;amp;&amp;amp; iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;(); i++) {
            deque.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;List&amp;lt;T&amp;gt;&amp;gt;(Long.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;, Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; List&amp;lt;T&amp;gt;&amp;gt; action) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                    deque.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (deque.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() &amp;gt; windowSize) {
                        deque.&lt;span style=&#34;color:#bbb&#34;&gt;pollFirst&lt;/span&gt;();
                    }
                    action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;(deque));
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
        }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;A, B&amp;gt; Stream&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;zip&lt;/span&gt;(Stream&amp;lt;A&amp;gt; streamA, Stream&amp;lt;B&amp;gt; streamB) {
        Spliterator&amp;lt;A&amp;gt; spliteratorA = streamA.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;();
        Spliterator&amp;lt;B&amp;gt; spliteratorB = streamB.&lt;span style=&#34;color:#bbb&#34;&gt;spliterator&lt;/span&gt;();

        Iterator&amp;lt;A&amp;gt; iteratorA = Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;(spliteratorA);
        Iterator&amp;lt;B&amp;gt; iteratorB = Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;(spliteratorB);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;AbstractSpliterator&lt;/span&gt;&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt;(
                Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(spliteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;estimateSize&lt;/span&gt;(), spliteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;estimateSize&lt;/span&gt;()), Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;ORDERED&lt;/span&gt;) {
            &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;tryAdvance&lt;/span&gt;(Consumer&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt; AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;A, B&amp;gt;&amp;gt; action) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (iteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;() &amp;amp;&amp;amp; iteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
                    A a = iteratorA.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                    B b = iteratorB.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
                    action.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;&amp;gt;(a, b));
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                }
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
            }
        }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T, R&amp;gt; R &lt;span style=&#34;color:#447fcf&#34;&gt;fold&lt;/span&gt;(Stream&amp;lt;T&amp;gt; stream, R identity, BiFunction&amp;lt;R, T, R&amp;gt; accumulator) {
        Iterator&amp;lt;T&amp;gt; iterator = stream.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;();
        R result = identity;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (iterator.&lt;span style=&#34;color:#bbb&#34;&gt;hasNext&lt;/span&gt;()) {
            result = accumulator.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(result, iterator.&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;());
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here is the runner class&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day81&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Shift example&amp;#34;&lt;/span&gt;);
        List&amp;lt;Integer&amp;gt; list = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(1, 2, 3, 4, 5);
        Stream&amp;lt;Integer&amp;gt; shiftedStream = CustomSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;shift&lt;/span&gt;(list.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(), 2);
        shiftedStream.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Slide example&amp;#34;&lt;/span&gt;);
        Stream&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; slidingStream = CustomSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;slide&lt;/span&gt;(list.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(), 3);
        slidingStream.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Zip example&amp;#34;&lt;/span&gt;);
        List&amp;lt;String&amp;gt; list2 = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;);
        Stream&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;Integer, String&amp;gt;&amp;gt; zippedStream = CustomSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;zip&lt;/span&gt;(list.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(), list2.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;());
        zippedStream.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(pair -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println(pair.&lt;span style=&#34;color:#bbb&#34;&gt;getKey&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt; + pair.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;()));

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Fold example&amp;#34;&lt;/span&gt;);
        Integer sum = CustomSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;fold&lt;/span&gt;(list.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(), 0, Integer::sum);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Sum: &amp;#34;&lt;/span&gt; + sum);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;example-calculating-moving-average&#34;&gt;Example: Calculating Moving Average&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a practical example of using our custom Spliterator to calculate a moving average:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;List&amp;lt;Double&amp;gt; stockPrices = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(100.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;, 102.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;, 98.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;, 103.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;, 99.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;, 101.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;);
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; windowSize = 3;

Stream&amp;lt;Double&amp;gt; movingAverages = CustomSpliterator.&lt;span style=&#34;color:#bbb&#34;&gt;slide&lt;/span&gt;(stockPrices.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(), windowSize)
    .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(window -&amp;gt; window.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;mapToDouble&lt;/span&gt;(Double::doubleValue).&lt;span style=&#34;color:#bbb&#34;&gt;average&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;orElse&lt;/span&gt;(0.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;));

movingAverages.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This code efficiently calculates the 3-day moving average of stock prices using our custom sliding window operation.&lt;/p&gt;
&lt;p&gt;Creating a custom Spliterator is an advanced technique that can significantly enhance your Java data processing capabilities. By combining shifting, sliding windows, zipping, and folding into a single, efficient component, we&amp;rsquo;ve created a powerful tool for complex data manipulation tasks.&lt;/p&gt;
&lt;p&gt;As you implement these techniques in your projects, remember to consider the trade-offs. While custom Spliterators offer great flexibility and power, they can also introduce complexity. Always benchmark your implementations to ensure they provide the expected performance benefits.&lt;/p&gt;
&lt;p&gt;Happy coding, and may your streams flow efficiently!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 80: From Concept to Code: Implementing a Dummy Consistent Hashing in Java using TreeMap</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day80-/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day80-/</id>
    <published>2024-05-23T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a Dummy Consistent Hashing in Java using TreeMap and Hash Function</summary>
    <content type="html">&lt;p&gt;As a software engineer working with distributed systems, ensuring efficient data distribution across nodes is crucial. Consistent hashing offers a robust solution for this challenge. This blog post will delve into a Java implementation of consistent hashing with unit tests, along with the key concepts and design decisions involved.&lt;/p&gt;
&lt;h2 id=&#34;understanding-consistent-hashing&#34;&gt;Understanding Consistent Hashing&lt;/h2&gt;
&lt;p&gt;Traditional hashing techniques often result in significant rehashing of keys when nodes are added or removed. Consistent hashing mitigates this by ensuring that only a small subset of keys are remapped. This property makes it highly suitable for scalable and fault-tolerant distributed systems.&lt;/p&gt;
&lt;h2 id=&#34;key-concepts&#34;&gt;Key Concepts&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1716810696/consistent_hashing_uxq5xo.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Fig: Consistent Hashing&lt;/p&gt;
&lt;h3 id=&#34;hash-function&#34;&gt;Hash Function&lt;/h3&gt;
&lt;p&gt;A Hash Function is a mathematical algorithm that takes an input (or &amp;lsquo;message&amp;rsquo;) and returns a fixed-size string of bytes. The output is typically a hash code or hash value. The primary purpose of a hash function is to map data of arbitrary size to data of a fixed size. In the context of consistent hashing, the hash function is used to assign both data keys and node identifiers to positions on the hash ring.&lt;/p&gt;
&lt;p&gt;The effectiveness of a hash function in consistent hashing depends on its ability to uniformly distribute the keys across the hash ring, minimizing the chances of collisions where two different inputs produce the same hash value. A good hash function ensures that the keys are spread evenly, which leads to efficient load balancing among nodes.&lt;/p&gt;
&lt;h3 id=&#34;hash-ring&#34;&gt;Hash Ring&lt;/h3&gt;
&lt;p&gt;The Hash Ring is a conceptual circular space that represents the range of possible hash values produced by the hash function. Imagine a circle where the hash values wrap around, creating a continuous loop. Both nodes (servers, caches, etc.) and data keys are hashed and placed on this ring.&lt;/p&gt;
&lt;p&gt;When placing a data key on the ring, the system looks for the nearest node in the clockwise direction. This node is responsible for storing that key. The circular nature of the hash ring ensures that every key has a node assignment, and it allows for a smooth transition when nodes are added or removed. By using a circular space, consistent hashing efficiently handles node dynamics with minimal data reshuffling.&lt;/p&gt;
&lt;h3 id=&#34;virtual-nodes&#34;&gt;Virtual Nodes&lt;/h3&gt;
&lt;p&gt;Virtual Nodes (or &amp;ldquo;vnodes&amp;rdquo;) are logical subdivisions of physical nodes in the hash ring. Instead of each physical node being represented by a single point on the ring, it can be represented by multiple virtual nodes. Each virtual node is assigned a unique position on the hash ring.&lt;/p&gt;
&lt;p&gt;Virtual nodes enhance the distribution of keys across the physical nodes, especially when there are a small number of physical nodes. They help achieve a more balanced load by mitigating the effects of uneven key distribution and ensuring that no single physical node becomes a bottleneck. When a physical node is added or removed, only the virtual nodes associated with that physical node need to be redistributed, leading to better fault tolerance and load balancing.&lt;/p&gt;
&lt;h3 id=&#34;replication&#34;&gt;Replication&lt;/h3&gt;
&lt;p&gt;Replication in the context of consistent hashing refers to the practice of placing multiple copies of each node on the hash ring to ensure better distribution and fault tolerance. This is controlled by the numberOfReplicas parameter in our implementation.&lt;/p&gt;
&lt;p&gt;By replicating nodes, we can distribute the keys more evenly across the hash ring. Each physical node is represented by several points (virtual nodes), and each point can independently take responsibility for a portion of the data. This approach also enhances fault tolerance: if a physical node fails, its virtual nodes can be easily reassigned to other physical nodes, ensuring that the data remains accessible. Replication minimizes the impact of node failures and ensures that the system can continue to function smoothly even when changes occur.&lt;/p&gt;
&lt;h3 id=&#34;problems-solved-by-consistent-hashing&#34;&gt;Problems Solved by Consistent Hashing&lt;/h3&gt;
&lt;h4 id=&#34;scalability&#34;&gt;Scalability:&lt;/h4&gt;
&lt;p&gt;Allows the system to scale easily by adding or removing nodes with minimal impact on data distribution.&lt;/p&gt;
&lt;h4 id=&#34;load-balancing&#34;&gt;Load Balancing:&lt;/h4&gt;
&lt;p&gt;Distributes data evenly across nodes, preventing any single node from becoming a bottleneck.&lt;/p&gt;
&lt;h4 id=&#34;fault-tolerance&#34;&gt;Fault Tolerance:&lt;/h4&gt;
&lt;p&gt;Reduces the risk of data loss by redistributing data automatically when nodes fail.&lt;/p&gt;
&lt;h3 id=&#34;implementing-consistent-hashing-in-java&#34;&gt;Implementing Consistent Hashing in Java&lt;/h3&gt;
&lt;p&gt;We begin by defining the ConsistentHashing class. This class includes methods to add and remove nodes and to find the corresponding node for a given key. We use the SHA-256 algorithm for hashing to ensure a good distribution of hash values.&lt;/p&gt;
&lt;p&gt;At first here I am considering&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weighted Nodes: Each node&amp;rsquo;s capacity is taken into account by adjusting the number of virtual nodes based on the node&amp;rsquo;s capacity. Nodes with higher capacities have more virtual nodes, ensuring a more balanced load distribution.&lt;/li&gt;
&lt;li&gt;Dynamic Node Management: Methods to add and remove nodes dynamically, taking into account the node capacities and redistributing data as needed.&lt;/li&gt;
&lt;li&gt;Replication and Quorum: Ensures data availability and consistency by writing to a quorum of nodes and reading from a quorum of nodes, even in the presence of node failures or removals.
This enhanced implementation ensures that nodes with different capacities are effectively utilized, leading to a more balanced and efficient distributed system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To implement this I am using a TreeMap. which uses the Red-Black tree inside it. Lets understand it a little bit.&lt;/p&gt;
&lt;h3 id=&#34;key-characteristics-of-treemap&#34;&gt;Key Characteristics of TreeMap&lt;/h3&gt;
&lt;h4 id=&#34;ordered&#34;&gt;Ordered:&lt;/h4&gt;
&lt;p&gt;TreeMap maintains its elements in ascending order, according to the natural ordering of its keys or by a comparator provided at map creation time.&lt;/p&gt;
&lt;h4 id=&#34;navigablemap-features&#34;&gt;NavigableMap Features:&lt;/h4&gt;
&lt;p&gt;It provides several methods to navigate the map, such as firstKey, lastKey, lowerKey, higherKey, subMap, headMap, and tailMap.&lt;/p&gt;
&lt;h3 id=&#34;internal-working&#34;&gt;Internal Working&lt;/h3&gt;
&lt;h4 id=&#34;red-black-tree&#34;&gt;Red-Black Tree:&lt;/h4&gt;
&lt;p&gt;Internally, TreeMap uses a Red-Black tree, which is a self-balancing binary search tree. This ensures that the tree remains balanced, and the operations can be performed in logarithmic time.&lt;/p&gt;
&lt;h4 id=&#34;node-structure-each-node-in-the-tree-contains&#34;&gt;Node Structure: Each node in the tree contains:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Key&lt;/li&gt;
&lt;li&gt;Value&lt;/li&gt;
&lt;li&gt;References to the left child, right child, and parent nodes&lt;/li&gt;
&lt;li&gt;A color attribute (red or black) to maintain balance according to Red-Black tree properties&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;key-characteristics-of-red-black-tree&#34;&gt;Key Characteristics of Red-Black tree&lt;/h3&gt;
&lt;p&gt;A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing its color, which can be either red or black. The color attribute helps maintain the balance of the tree during insertions and deletions. Here’s a detailed explanation:&lt;/p&gt;
&lt;p&gt;Key Properties of Red-Black Trees
Binary Search Tree Property: Like all binary search trees (BST), for each node, the value of the left child is less than its value, and the value of the right child is greater.&lt;/p&gt;
&lt;p&gt;Red-Black Properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Property 1: Each node is either red or black.&lt;/li&gt;
&lt;li&gt;Property 2: The root node is always black.&lt;/li&gt;
&lt;li&gt;Property 3: All leaves (NIL nodes) are black. These are the null children of a leaf node, considered black for simplicity in maintaining tree properties.&lt;/li&gt;
&lt;li&gt;Property 4: If a red node has children, then the children are always black (no two red nodes can be adjacent).&lt;/li&gt;
&lt;li&gt;Property 5: Every path from a given node to any of its descendant leaves has the same number of black nodes (black-height).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now let us see the use case of TreeMap to implement a Dummy consistent hashing&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ConsistentHashingWithWeightedNodes&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; SortedMap&amp;lt;Integer, String&amp;gt; ring = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TreeMap&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;String, Integer&amp;gt; nodeCapacities = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; replicationFactor;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; writeQuorum;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; readQuorum;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Map&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt; dataStore = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MessageDigest md5;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This defines the &lt;code&gt;ConsistentHashingWithWeightedNodes&lt;/code&gt; class with the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ring&lt;/code&gt;: A &lt;code&gt;SortedMap&lt;/code&gt; to represent the consistent hashing ring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodeCapacities&lt;/code&gt;: A &lt;code&gt;Map&lt;/code&gt; to store each node&amp;rsquo;s capacity.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replicationFactor&lt;/code&gt;: Number of replicas for each data item.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;writeQuorum&lt;/code&gt;: Minimum number of nodes that must acknowledge a write for it to be considered successful.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;readQuorum&lt;/code&gt;: Minimum number of nodes that must be contacted to successfully read data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dataStore&lt;/code&gt;: A nested &lt;code&gt;Map&lt;/code&gt; to store the actual data on each node.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;md5&lt;/code&gt;: An instance of &lt;code&gt;MessageDigest&lt;/code&gt; for computing MD5 hashes.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ConsistentHashingWithWeightedNodes&lt;/span&gt;(Map&amp;lt;String, Integer&amp;gt; nodes, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; replicationFactor, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; writeQuorum, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; readQuorum) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchAlgorithmException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;md5&lt;/span&gt; = MessageDigest.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MD5&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;replicationFactor&lt;/span&gt; = replicationFactor;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;writeQuorum&lt;/span&gt; = writeQuorum;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;readQuorum&lt;/span&gt; = readQuorum;

&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is the constructor of the ConsistentHashingWithWeightedNodes class. It initializes the md5 instance for hashing and sets the replication factor, write quorum, and read quorum.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Map.&lt;span style=&#34;color:#bbb&#34;&gt;Entry&lt;/span&gt;&amp;lt;String, Integer&amp;gt; entry : nodes.&lt;span style=&#34;color:#bbb&#34;&gt;entrySet&lt;/span&gt;()) {
            addNode(entry.&lt;span style=&#34;color:#bbb&#34;&gt;getKey&lt;/span&gt;(), entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;());
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The constructor adds all nodes from the input &lt;code&gt;nodes&lt;/code&gt; map, which contains node names and their respective capacities, to the consistent hashing ring using the &lt;code&gt;addNode&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;hash&lt;/span&gt;(String key) {
        md5.&lt;span style=&#34;color:#bbb&#34;&gt;update&lt;/span&gt;(key.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] digest = md5.&lt;span style=&#34;color:#bbb&#34;&gt;digest&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ByteBuffer.&lt;span style=&#34;color:#bbb&#34;&gt;wrap&lt;/span&gt;(digest).&lt;span style=&#34;color:#bbb&#34;&gt;getInt&lt;/span&gt;();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This method computes the MD5 hash of a given key and converts it to an integer. The hash value is used to place nodes and data on the consistent hashing ring.
Here the ByteBuffer is used for getting the output of digest array to an interger.&lt;/p&gt;
&lt;p&gt;Let’s say the digest array contains the following bytes (in hexadecimal):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;digest = {0x12, 0x34, 0x56, 0x78, ...};
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When you call &lt;code&gt;ByteBuffer.wrap(digest).getInt()&lt;/code&gt; the following steps occur:&lt;/p&gt;
&lt;h5 id=&#34;wrap-the-byte-array&#34;&gt;Wrap the Byte Array:&lt;/h5&gt;
&lt;p&gt;ByteBuffer.wrap(digest) creates a ByteBuffer that points to the digest array.&lt;/p&gt;
&lt;h5 id=&#34;read-an-integer&#34;&gt;Read an Integer:&lt;/h5&gt;
&lt;p&gt;getInt() reads the first four bytes: 0x12, 0x34, 0x56, 0x78. Since ByteBuffer uses big-endian order, these bytes are interpreted as the integer:0x12345678&lt;/p&gt;
&lt;p&gt;In decimal, this value is 305419896.&lt;/p&gt;
&lt;p&gt;So, the line ByteBuffer.wrap(digest).getInt() effectively converts the first four bytes of the digest array into an integer in a straightforward and readable manner.&lt;/p&gt;
&lt;h4 id=&#34;usage-in-context&#34;&gt;Usage in Context&lt;/h4&gt;
&lt;p&gt;In the context of the hash function, this conversion is used to transform the MD5 hash (which is a 16-byte array) into a single integer value. This integer value is then used to place nodes and keys on the consistent hashing ring.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;addNode&lt;/span&gt;(String node, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; capacity) {
        nodeCapacities.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(node, capacity);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; virtualNodes = capacity; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Use capacity directly as the number of virtual nodes for simplicity
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;addNode&lt;/code&gt; method adds a node to the consistent hashing ring. The number of virtual nodes for this node is determined by its capacity.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; virtualNodes; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = hash(node + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt; + i);
            ring.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(hash, node);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For each virtual node, the method computes its hash and adds it to the ring.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;removeNode&lt;/span&gt;(String node) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; virtualNodes = nodeCapacities.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(node);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;removeNode&lt;/code&gt; method removes a node and its virtual nodes from the ring. It first retrieves the number of virtual nodes based on the node&amp;rsquo;s capacity.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; virtualNodes; i++) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = hash(node + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt; + i);
            ring.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(hash);
        }
        
        nodeCapacities.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(node);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It then removes each virtual node from the ring and finally removes the node from the &lt;code&gt;nodeCapacities&lt;/code&gt; map.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; List&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getNodesForKey&lt;/span&gt;(String key) {
        List&amp;lt;String&amp;gt; nodes = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = hash(key);
        SortedMap&amp;lt;Integer, String&amp;gt; tailMap = ring.&lt;span style=&#34;color:#bbb&#34;&gt;tailMap&lt;/span&gt;(hash);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;getNodesForKey&lt;/code&gt; method determines which nodes should store a given key. It first computes the hash of the key and finds the relevant segment in the ring.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Map.&lt;span style=&#34;color:#bbb&#34;&gt;Entry&lt;/span&gt;&amp;lt;Integer, String&amp;gt; entry : tailMap.&lt;span style=&#34;color:#bbb&#34;&gt;entrySet&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!nodes.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;())) {
                nodes.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;());
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (nodes.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() == replicationFactor) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; nodes;
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It iterates through the tail map (the part of the ring starting from the key&amp;rsquo;s hash) and adds nodes to the list until the replication factor is met.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Map.&lt;span style=&#34;color:#bbb&#34;&gt;Entry&lt;/span&gt;&amp;lt;Integer, String&amp;gt; entry : ring.&lt;span style=&#34;color:#bbb&#34;&gt;entrySet&lt;/span&gt;()) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!nodes.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;())) {
                nodes.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(entry.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;());
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (nodes.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() == replicationFactor) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;break&lt;/span&gt;;
                }
            }
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; nodes;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the tail map does not contain enough nodes, it continues from the beginning of the ring until it has enough nodes to meet the replication factor.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;writeData&lt;/span&gt;(String key, String value) {
        List&amp;lt;String&amp;gt; nodes = getNodesForKey(key);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; successCount = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (String node : nodes) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (writeToNode(node, key, value)) {
                successCount++;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (successCount &amp;gt;= writeQuorum) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                }
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;writeData&lt;/code&gt; method writes data to the nodes responsible for the key. It retrieves the nodes using &lt;code&gt;getNodesForKey&lt;/code&gt; and writes to each node until the write quorum is met.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;writeToNode&lt;/span&gt;(String node, String key, String value) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!dataStore.&lt;span style=&#34;color:#bbb&#34;&gt;containsKey&lt;/span&gt;(node)) {
            dataStore.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(node, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;());
        }
        dataStore.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(node).&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(key, value);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;writeToNode&lt;/code&gt; method actually writes the key-value pair to the node&amp;rsquo;s data store. If the node does not already have a data store, it creates one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;readData&lt;/span&gt;(String key) {
        List&amp;lt;String&amp;gt; nodes = getNodesForKey(key);
        Map&amp;lt;String, Integer&amp;gt; valueCounts = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (String node : nodes) {
            String value = readFromNode(node, key);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (value != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                valueCounts.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(value, valueCounts.&lt;span style=&#34;color:#bbb&#34;&gt;getOrDefault&lt;/span&gt;(value, 0) + 1);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (valueCounts.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(value) &amp;gt;= readQuorum) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; value;
                }
            }
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;No Data Found&amp;#34;&lt;/span&gt;;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;readData&lt;/code&gt; method reads data for a given key from the responsible nodes. It counts the occurrences of each value read and returns the value if it meets the read quorum.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;readFromNode&lt;/span&gt;(String node, String key) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (dataStore.&lt;span style=&#34;color:#bbb&#34;&gt;containsKey&lt;/span&gt;(node)) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; dataStore.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(node).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(key);
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;readFromNode&lt;/code&gt; method retrieves the value for a key from a specific node&amp;rsquo;s data store.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchAlgorithmException {
        Map&amp;lt;String, Integer&amp;gt; nodes = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
        nodes.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Node1&amp;#34;&lt;/span&gt;, 1); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Capacity 1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        nodes.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Node2&amp;#34;&lt;/span&gt;, 3); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Capacity 3
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        nodes.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Node3&amp;#34;&lt;/span&gt;, 2); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Capacity 2
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; replicationFactor = 3;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; writeQuorum = 2;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; readQuorum = 2;

        ConsistentHashingWithWeightedNodes ch = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ConsistentHashingWithWeightedNodes(nodes, replicationFactor, writeQuorum, readQuorum);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Writing data...&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Write key1: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;writeData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;value1&amp;#34;&lt;/span&gt;));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Write key2: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;writeData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;value2&amp;#34;&lt;/span&gt;));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Write key3: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;writeData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;value3&amp;#34;&lt;/span&gt;));

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Reading data...&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Read key1: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;readData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key1&amp;#34;&lt;/span&gt;));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Read key2: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;readData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Read key3: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;readData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key3&amp;#34;&lt;/span&gt;));

        ch.&lt;span style=&#34;color:#bbb&#34;&gt;addNode&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Node4&amp;#34;&lt;/span&gt;, 5); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Adding a new node with higher capacity
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Write key4 after adding Node4: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;writeData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key4&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;value4&amp;#34;&lt;/span&gt;));

        ch.&lt;span style=&#34;color:#bbb&#34;&gt;removeNode&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Node2&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Read key2 after removing Node2: &amp;#34;&lt;/span&gt; + ch.&lt;span style=&#34;color:#bbb&#34;&gt;readData&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; method demonstrates the usage of the &lt;code&gt;ConsistentHashingWithWeightedNodes&lt;/code&gt; class. It:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creates a map of nodes with different capacities.&lt;/li&gt;
&lt;li&gt;Initializes the consistent hashing ring with these nodes.&lt;/li&gt;
&lt;li&gt;Writes some data and prints the results.&lt;/li&gt;
&lt;li&gt;Reads the data&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here I discussed about Replication Factor and Quorum. Will discuss them in details in some later post. For now posting some resource for further learning consistent hashing, Red-Black tree, Replication and Quorum.&lt;/p&gt;
&lt;h2 id=&#34;consistent-hashing-&#34;&gt;Consistent Hashing :&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/codex/understanding-and-implementing-consistent-hash-algorithm-e53a35afa428&#34;&gt;https://medium.com/codex/understanding-and-implementing-consistent-hash-algorithm-e53a35afa428&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://rmarcus.info/blog/2018/09/14/consistent-hashing-overflow.html&#34;&gt;https://rmarcus.info/blog/2018/09/14/consistent-hashing-overflow.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;red-black-tree-&#34;&gt;Red-Black Tree :&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://zarif98sjs.github.io/blog/blog/redblacktree/&#34;&gt;https://zarif98sjs.github.io/blog/blog/redblacktree/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stackoverflow.com/questions/31779786/how-tree-map-uses-red-black-tree-algorithm&#34;&gt;https://stackoverflow.com/questions/31779786/how-tree-map-uses-red-black-tree-algorithm&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;replication-in-the-context-of-consistent-hashing-&#34;&gt;Replication In the context of Consistent hashing :&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://dev.to/arslan_ah/how-to-use-consistent-hashing-in-a-system-design-interview-33ge&#34;&gt;https://dev.to/arslan_ah/how-to-use-consistent-hashing-in-a-system-design-interview-33ge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.geeksforgeeks.org/what-is-replication-in-consistent-hashing/&#34;&gt;https://www.geeksforgeeks.org/what-is-replication-in-consistent-hashing/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;quorum-&#34;&gt;Quorum :&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://systemdesign.one/consistency-patterns/?ref=highscalability.com&#34;&gt;https://systemdesign.one/consistency-patterns/?ref=highscalability.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://code.likeagirl.io/distributed-computing-quorum-consistency-in-replication-96e64f7b5c6&#34;&gt;https://code.likeagirl.io/distributed-computing-quorum-consistency-in-replication-96e64f7b5c6&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Day 79: Did you know that too much print statement can cost you money</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day79-/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day79-/</id>
    <published>2024-05-03T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Day 79: Like Python In java printing takes too much processing time which costs money</summary>
    <content type="html">&lt;p&gt;In this twitter post &lt;a href=&#34;https://x.com/ekzhang1/status/1785886484140065087&#34;&gt;https://x.com/ekzhang1/status/1785886484140065087&lt;/a&gt; the author saved $27000/year by removing 10 lines of code they were print() statements. So I just wondered as he did it for python does java printing causes lot of processing time? and if so how about writing the same string in a file. This question let me down a rabbit hole of how printing works in java&lt;/p&gt;
&lt;p&gt;Many developers, especially those new to Java, often rely on &lt;code&gt;System.out.println()&lt;/code&gt; for debugging and logging purposes. While this approach is convenient during development, it can become a performance hindrance in production environments, particularly when dealing with high-volume logging scenarios.&lt;/p&gt;
&lt;h3 id=&#34;the-problem-with-systemoutprintln&#34;&gt;The Problem with &lt;code&gt;System.out.println()&lt;/code&gt;&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;The &lt;code&gt;System.out.println()&lt;/code&gt; method is a synchronous operation that involves several steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Acquiring a lock&lt;/strong&gt;: Before writing to the console, the method must acquire a lock on the &lt;code&gt;System.out&lt;/code&gt; object to ensure thread safety.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;String concatenation&lt;/strong&gt;: If the argument passed to &lt;code&gt;println()&lt;/code&gt; is not a string, it must be converted to a string using the &lt;code&gt;toString()&lt;/code&gt; method, which can be a costly operation for complex objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writing to the console&lt;/strong&gt;: The actual writing of the string to the console stream occurs in this step.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flushing the stream&lt;/strong&gt;: After writing, the console stream is flushed to ensure that the data is immediately visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Releasing the lock&lt;/strong&gt;: Finally, the lock on the &lt;code&gt;System.out&lt;/code&gt; object is released.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While these steps may seem trivial, they can introduce significant overhead, especially when logging is performed extensively in performance-critical sections of the code.&lt;/p&gt;
&lt;p&gt;Furthermore, If we look into why &lt;code&gt;System.out.println()&lt;/code&gt; is slow we will find some stackoverflow discussion about it. From one of it&amp;rsquo;s &lt;a href=&#34;https://stackoverflow.com/a/4437752/3088368&#34;&gt;discussion&lt;/a&gt; I came to know printing to the console (using println) is slow because of the operating system overhead, not the act of printing itself. They compare it to saving a file, which is similar speed. The slowdown comes from the console displaying characters one by one, including rendering fonts and potentially scrolling the screen.&lt;/p&gt;
&lt;p&gt;Fortunately, Java provides more efficient alternatives for logging, including writing to files and using dedicated logging libraries like Log4j.&lt;/p&gt;
&lt;h3 id=&#34;writing-to-a-file&#34;&gt;Writing to a File&lt;/h3&gt;
&lt;p&gt;Writing log messages directly to a file can be more efficient than printing to the console. Here&amp;rsquo;s an example code snippet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedWriter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileWriter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FileLogger&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String LOG_FILE = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;application.log&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (BufferedWriter writer = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedWriter(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileWriter(LOG_FILE, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;))) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1000000; i++) {
                writer.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello World &amp;#34;&lt;/span&gt; + i + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we create a &lt;code&gt;BufferedWriter&lt;/code&gt; to write log messages to a file named &lt;code&gt;application.log&lt;/code&gt;. The &lt;code&gt;BufferedWriter&lt;/code&gt; helps improve performance by buffering the data before writing it to the file. However, manually managing file I/O operations can be cumbersome and error-prone, especially in multithreaded environments.&lt;/p&gt;
&lt;h3 id=&#34;using-log4j-with-console-appender&#34;&gt;Using Log4j with Console Appender&lt;/h3&gt;
&lt;p&gt;Log4j is a widely-used logging library that provides a robust and configurable logging solution. Instead of writing directly to the console or a file, Log4j allows you to configure various appenders (output destinations) and log levels. Here&amp;rsquo;s an example of using Log4j with a console appender:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.apache.logging.log4j.LogManager&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.apache.logging.log4j.Logger&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Log4jExample&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LogManager.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(Log4jExample.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1000000; i++) {
            logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello World &amp;#34;&lt;/span&gt; + i);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we use the &lt;code&gt;LogManager&lt;/code&gt; class to obtain a &lt;code&gt;Logger&lt;/code&gt; instance for the &lt;code&gt;Log4jExample&lt;/code&gt; class. The &lt;code&gt;logger.info()&lt;/code&gt; method is used to log messages at the INFO level. Log4j provides various log levels (e.g., DEBUG, INFO, WARN, ERROR) and allows you to configure the desired log level and appenders through configuration files or programmatically.&lt;/p&gt;
&lt;p&gt;Log4j offers several advantages over &lt;code&gt;System.out.println()&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous logging&lt;/strong&gt;: Log4j can buffer log messages and write them asynchronously, reducing the impact on the main application thread.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configurability&lt;/strong&gt;: Log4j allows you to configure various appenders (e.g., file, console, database), log levels, and formatting options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance optimization&lt;/strong&gt;: Log4j employs techniques like message construction avoidance, which means that log messages are only constructed if they meet the configured log level, reducing unnecessary string operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;benchmarking-with-jmh&#34;&gt;Benchmarking with JMH&lt;/h2&gt;
&lt;p&gt;To put these claims to the test, we&amp;rsquo;ll use the Java Microbenchmark Harness (JMH), a powerful tool for benchmarking Java code. Here&amp;rsquo;s an example of how we can benchmark the three techniques discussed above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@BenchmarkMode&lt;/span&gt;(Mode.&lt;span style=&#34;color:#bbb&#34;&gt;AverageTime&lt;/span&gt;)
&lt;span style=&#34;color:#ffa500&#34;&gt;@OutputTimeUnit&lt;/span&gt;(TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;)
&lt;span style=&#34;color:#ffa500&#34;&gt;@State&lt;/span&gt;(Scope.&lt;span style=&#34;color:#bbb&#34;&gt;Thread&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day79&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LogManager.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(Day79.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String LOG_FILE = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;logfile.txt&amp;#34;&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; numIterations = 100000;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;systemOutPrintln&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; numIterations; i++) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;);
        }
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;writeToFile&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            Path path = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(LOG_FILE);
            Files.&lt;span style=&#34;color:#bbb&#34;&gt;createFile&lt;/span&gt;(path);

            List&amp;lt;String&amp;gt; lines = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;(Collections.&lt;span style=&#34;color:#bbb&#34;&gt;nCopies&lt;/span&gt;(numIterations, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;));

            Files.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(path, lines, StandardOpenOption.&lt;span style=&#34;color:#bbb&#34;&gt;APPEND&lt;/span&gt;);

            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;File written successfully.&amp;#34;&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error writing to file: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;log4jConsoleAppender&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; numIterations; i++) {
            logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we define three benchmark methods: &lt;code&gt;systemOutPrintln()&lt;/code&gt;, &lt;code&gt;writeToFile()&lt;/code&gt;, and &lt;code&gt;log4jConsoleAppender()&lt;/code&gt;. Each method represents one of the logging techniques we want to benchmark.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;@BenchmarkMode&lt;/code&gt; annotation specifies that we want to measure the average time taken by each method. The &lt;code&gt;@OutputTimeUnit&lt;/code&gt; annotation sets the time unit for the benchmark results to nanoseconds. Finally, the &lt;code&gt;@State(Scope.Thread)&lt;/code&gt; annotation ensures that each benchmark method is executed in a separate thread.&lt;/p&gt;
&lt;p&gt;After running the benchmark, we should see results similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Run complete. Total time: 00:26:52
Benchmark                         Mode  Cnt     Score     Error  Units
Day79.log4jConsoleAppender  avgt   25     0.121 ±   0.004  ms/op
Day79.systemOutPrintln      avgt   25  4089.977 ± 417.122  ms/op
Day79.writeToFile           avgt   25     0.346 ±   0.071  ms/op
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The results are given in milliseconds per operation (ms/op), which means how many milliseconds it takes on average to perform one operation. The lower the ms/op, the faster the operation.&lt;br&gt;
Day79.log4jConsoleAppender: This operation takes on average 0.121 ms/op. This is the fastest operation among the three.&lt;br&gt;
Day79.systemOutPrintln: This operation takes on average 4089.977 ms/op. This is significantly slower than the other two operations.&lt;br&gt;
Day79.writeToFile: This operation takes on average 0.346 ms/op. This is slower than log4jConsoleAppender but much faster than systemOutPrintln.&lt;br&gt;
The ± value represents the error in the measurement. It means the actual value could be within this range. For example, for writeToFile, the actual average could be between (0.346 - 0.071) and (0.346 + 0.071).&lt;/p&gt;
&lt;p&gt;These results clearly show that &lt;code&gt;System.out.println()&lt;/code&gt; is significantly slower than the Log4j console appender, and writing to a file is the slowest option among the three.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this blog post, we explored the performance implications of using &lt;code&gt;System.out.println()&lt;/code&gt; for logging in Java applications. We discussed more efficient alternatives, such as writing to files and using dedicated logging libraries like Log4j. Additionally, we provided benchmark results using JMH to demonstrate the performance differences between these techniques.&lt;/p&gt;
&lt;p&gt;While &lt;code&gt;System.out.println()&lt;/code&gt; may be convenient for simple debugging during development, it should be avoided in performance-critical scenarios or production environments. Instead, consider using a logging library like Log4j, which offers better performance, configurability, and flexibility.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 78: Java 22 - Embracing Safe Memory Allocation Using FFM API - An alternative to Unsafe API</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day78/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day78/</id>
    <published>2024-04-18T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Day 78: Java 22 - Embracing Safe Memory Allocation Using FFM API - An alternative to Unsafe API</summary>
    <content type="html">&lt;p&gt;In my previous blog post I talked about Java Unsafe API and how to use it to make a Memory Allocator. Now as Java 22 released new FFM API is here to provide safety that we didnt had while using Java Unsafe API to allocate off the heap memory. In this post I will discuss about the new api and how it works and how we can use this to create safe memory allocator.&lt;/p&gt;
&lt;h2 id=&#34;memorysegment-api-and-arena-in-java-ffm&#34;&gt;MemorySegment API and Arena in Java FFM&lt;/h2&gt;
&lt;p&gt;The Foreign Function and Memory (FFM) API introduced in Java 20 allows Java programs to interoperate with code and data outside of the Java runtime. This API provides a safer and more controlled way to interact with native code compared to JNI. One of the key components of the FFM API is the MemorySegment API, which provides a Java representation of off-heap memory. Arena, on the other hand, is a memory management construct that controls the lifecycle of memory segments.&lt;/p&gt;
&lt;h3 id=&#34;memorysegment-api&#34;&gt;MemorySegment API&lt;/h3&gt;
&lt;p&gt;A MemorySegment object represents a contiguous block of off-heap memory. It provides methods to allocate, deallocate, access, and deallocate memory. Memory segments are language-agnostic, meaning they can be used to hold any type of data, not just Java objects.&lt;/p&gt;
&lt;p&gt;Here are some of the key features of the MemorySegment API:&lt;/p&gt;
&lt;h4 id=&#34;allocation-and-deallocation&#34;&gt;Allocation and Deallocation:&lt;/h4&gt;
&lt;p&gt;Memory segments can be allocated in various ways, including fixed-size allocations and allocations that grow or shrink as needed.&lt;/p&gt;
&lt;h4 id=&#34;access&#34;&gt;Access:&lt;/h4&gt;
&lt;p&gt;Memory segments can be accessed using Java byte buffers, which provide a familiar way to work with raw memory.&lt;/p&gt;
&lt;h4 id=&#34;deallocation&#34;&gt;Deallocation:&lt;/h4&gt;
&lt;p&gt;Memory segments can be explicitly deallocated when they are no longer needed. This helps to avoid memory leaks.&lt;/p&gt;
&lt;h3 id=&#34;arena&#34;&gt;Arena&lt;/h3&gt;
&lt;p&gt;An Arena is a memory management construct that simplifies the lifecycle management of memory segments. It provides a pool of memory that can be used to allocate memory segments. Arenas can be configured with different memory allocation strategies and deallocation behavior.&lt;/p&gt;
&lt;p&gt;Here are some of the key benefits of using arenas:&lt;/p&gt;
&lt;h4 id=&#34;improved-memory-management&#34;&gt;Improved Memory Management:&lt;/h4&gt;
&lt;p&gt;Arenas simplify memory management by providing a centralized pool of memory for allocation.&lt;/p&gt;
&lt;h4 id=&#34;reduced-memory-fragmentation&#34;&gt;Reduced Memory Fragmentation:&lt;/h4&gt;
&lt;p&gt;Arenas can help to reduce memory fragmentation by allocating memory segments from a contiguous block.&lt;/p&gt;
&lt;h4 id=&#34;thread-safety&#34;&gt;Thread Safety:&lt;/h4&gt;
&lt;p&gt;Arenas are thread-safe, meaning that multiple threads can safely allocate and deallocate memory segments from the same arena.&lt;/p&gt;
&lt;p&gt;An arena manages access to native memory and ensures that allocated memory blocks are released again and that we do not access memory that has already been released.&lt;/p&gt;
&lt;p&gt;There are four types of arenas that we can create using static factory methods of the Arena class:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Global arena&lt;/li&gt;
&lt;li&gt;Automatic arenas (managed by the garbage collector)&lt;/li&gt;
&lt;li&gt;Confined arenas&lt;/li&gt;
&lt;li&gt;Shared arenas&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;memory-allocator-and-de-allocator-with-arena-and-memorysegment&#34;&gt;Memory Allocator and De-allocator with Arena and MemorySegment&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s an example of a simple memory allocator and de-allocator class that uses an Arena to allocate and deallocate memory segments for writing strings:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.foreign.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MemoryAllocator&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Arena arena = Arena.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; MemorySegment &lt;span style=&#34;color:#447fcf&#34;&gt;allocate&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; size) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; arena.&lt;span style=&#34;color:#bbb&#34;&gt;allocate&lt;/span&gt;(size);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;deallocate&lt;/span&gt;(MemorySegment segment) {
        segment.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now using the &lt;code&gt;MemoryAllocator&lt;/code&gt; class&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Class Day78 {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Initialize
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        MemorySegment segment = allocate(100);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//write hello world to the initialized memory segment
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        segment.&lt;span style=&#34;color:#bbb&#34;&gt;getByteBuffer&lt;/span&gt;(0, 100).&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//read from the memory segment
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] bytes = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[100];
        segment.&lt;span style=&#34;color:#bbb&#34;&gt;getByteBuffer&lt;/span&gt;(0, 100).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(bytes);
        String message = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(bytes);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(message);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// deallocate the memorySegment
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        deallocate(segment);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here &lt;code&gt;private static final Arena arena = Arena.create();&lt;/code&gt; This line creates a single, static instance of Arena and assigns it to the arena field. An Arena is a memory pool used to allocate memory segments. Since this is declared static and final, only one Arena instance is created for the entire class and its behavior cannot be changed after initialization.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;public static MemorySegment allocate(int size)&lt;/code&gt; This is a public static method named allocate. It takes an integer size as input and returns a MemorySegment object. This method delegates the allocation task to the arena instance by calling arena.allocate(size). It essentially requests a block of off-heap memory of the specified size from the Arena pool.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;public static void deallocate(MemorySegment segment)&lt;/code&gt; This is another public static method named deallocate. It takes a MemorySegment object as input and doesn&amp;rsquo;t return any value (void). This method calls segment.close() to release the memory segment back to the Arena pool. It signifies that the allocated memory is no longer needed.&lt;/p&gt;
&lt;p&gt;For further learning you can visit this java documentation. &lt;a href=&#34;https://docs.oracle.com/en/java/javase/20/core/foreign-function-and-memory-api.html#GUID-1CA5C639-6C65-45A7-85E5-7926DB0D6A32&#34;&gt;https://docs.oracle.com/en/java/javase/20/core/foreign-function-and-memory-api.html#GUID-1CA5C639-6C65-45A7-85E5-7926DB0D6A32&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 77: Explore Something Unsafe : Crafting a Memory allocator using Java Unsafe API</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day77/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day77/</id>
    <published>2024-03-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Explore Something Unsafe : Crafting a Memory allocator using Java Unsafe API</summary>
    <content type="html">&lt;p&gt;In the realm of Java development, the &lt;code&gt;sun.misc.Unsafe&lt;/code&gt; API stands as both a powerful tool and a notorious enigma. It offers a direct interface to native memory and low-level operations, granting developers unprecedented control over memory management and object manipulation. While officially designated as &amp;ldquo;unsafe&amp;rdquo; due to its potential for misuse, this API remains indispensable in certain scenarios, enabling performance optimizations and facilitating the implementation of critical functionality in numerous Java libraries and frameworks.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-intricacies-of-unsafe-api&#34;&gt;Understanding the Intricacies of Unsafe API&lt;/h2&gt;
&lt;p&gt;At its core, the &lt;code&gt;Unsafe&lt;/code&gt; API provides a means to perform operations typically restricted by the Java Virtual Machine (JVM) for safety reasons. These operations include direct memory access, object allocation and manipulation, thread synchronization, and more. By bypassing the usual safeguards of the JVM, developers can achieve performance gains and implement functionalities that would otherwise be impossible or impractical within the confines of standard Java.&lt;/p&gt;
&lt;p&gt;One of the primary use cases of the &lt;code&gt;Unsafe&lt;/code&gt; API is for off-heap memory management. Unlike Java&amp;rsquo;s managed heap, which is subject to garbage collection and automatic memory management, off-heap memory managed via &lt;code&gt;Unsafe&lt;/code&gt; offers greater control and reduced overhead. This is particularly beneficial in scenarios requiring predictable memory allocation and deallocation, such as high-performance computing, networking, and database systems.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sun.misc.Unsafe&lt;/code&gt; API in Java provides access to low-level, unsafe operations typically reserved for the JVM. It exposes methods that allow direct manipulation of memory, objects, and threads, bypassing some of Java&amp;rsquo;s built-in safety mechanisms. Here&amp;rsquo;s how it works and what it enables:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Operations&lt;/li&gt;
&lt;li&gt;Object Manipulation&lt;/li&gt;
&lt;li&gt;Array Operations&lt;/li&gt;
&lt;li&gt;Synchronization&lt;/li&gt;
&lt;li&gt;Class and Native memory operations&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;unsafe-bypassing-the-guardrails&#34;&gt;Unsafe: Bypassing the Guardrails&lt;/h2&gt;
&lt;p&gt;Java enforces memory safety through garbage collection and automatic memory management. The Unsafe API circumvents these mechanisms, allowing direct manipulation of memory addresses. This capability unlocks several functionalities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory Allocation and Deallocation:&lt;/strong&gt; You can allocate off-heap memory (outside the JVM&amp;rsquo;s managed heap) for performance-critical tasks. This is useful for large data structures or handling native data types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Field and Array Manipulation:&lt;/strong&gt; The Unsafe API allows direct access and modification of fields and array elements, even if they are declared private or final. This can be helpful for performance optimization or implementing custom data structures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thread Management:&lt;/strong&gt; Unsafe provides low-level control over thread scheduling and synchronization. This is rarely used in practice due to the complexity and potential for race conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;unsafe-and-native-memory-a-delicate-dance&#34;&gt;Unsafe and Native Memory: A Delicate Dance&lt;/h2&gt;
&lt;p&gt;The Unsafe API interacts with native memory (memory managed by the operating system) through pointers. These pointers hold memory addresses that the Unsafe API can use to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access Native Data Structures:&lt;/strong&gt; You can interact with C libraries or legacy code that relies on native data structures. The Unsafe API allows you to convert Java objects to their corresponding native memory representation for seamless data exchange.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory-Mapped Files:&lt;/strong&gt; Memory-mapped files allow you to work with a file as if it were part of your program&amp;rsquo;s virtual memory. The Unsafe API facilitates this by creating mappings between file regions and memory addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;we will dive deep on the &lt;code&gt;Native memory operations&lt;/code&gt; by writing a memory allocator and deallocator and using it to write something directly to the memory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;sun.misc.Unsafe&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomMemoryAllocator&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Unsafe unsafe = Unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;getUnsafe&lt;/span&gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; BASE_OFFSET = unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;arrayBaseOffset&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[].&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;allocateMemory&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; bytes) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;allocateMemory&lt;/span&gt;(bytes);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;freeMemory&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; address) {
        unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;(address);
    }

	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;writeData&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; address, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] data) { 
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; data.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) { 
			unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;putByte&lt;/span&gt;(address + i, data[i]); 
			} 
		}
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;readData&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; address, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; length) { 
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] data = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[length]; 
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; length; i++) { 
			data[i] = unsafe.&lt;span style=&#34;color:#bbb&#34;&gt;getByte&lt;/span&gt;(address + i); 
		} 
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; data; 
	}
}

&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here we are  acquiring a static reference to the Unsafe object, the gateway for direct memory operations. - &lt;code&gt;private static final long BASE_OFFSET = unsafe.arrayBaseOffset(byte[].class);&lt;/code&gt;: Determines the starting offset of byte arrays within memory, crucial for efficient manipulation.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;unsafe.arrayBaseOffset(byte[].class)&lt;/code&gt;This is a method call on the &lt;code&gt;unsafe&lt;/code&gt; object. The &lt;code&gt;arrayBaseOffset&lt;/code&gt; method retrieves the base offset of the given array type. In this case, it&amp;rsquo;s finding the base offset for &lt;code&gt;byte[]&lt;/code&gt; arrays.&lt;/p&gt;
&lt;p&gt;Then &lt;code&gt;allocateMemory(long bytes)&lt;/code&gt; - Requests a memory block of the specified size from the operating system, bypassing JVM&amp;rsquo;s heap. It returns a memory address representing the allocated block&amp;rsquo;s start.&lt;/p&gt;
&lt;p&gt;Then &lt;code&gt;freeMemory(long address)&lt;/code&gt;: Deallocates the memory block associated with the given address, relinquishing it back to the OS. 
Crucial for preventing memory leaks in custom allocation scenarios.&lt;/p&gt;
&lt;p&gt;Now let us use this to write string into an allocated memory and then free the memory&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day77&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; address = CustomMemoryAllocator.&lt;span style=&#34;color:#bbb&#34;&gt;allocateMemory&lt;/span&gt;(1024); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Allocate 1 KB of memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (address != 0) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Ensure memory allocation was successful
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Memory allocated successfully at address: &amp;#34;&lt;/span&gt; + address);
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Write data to the allocated memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            CustomMemoryAllocator.&lt;span style=&#34;color:#bbb&#34;&gt;writeData&lt;/span&gt;(address, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;());
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Read data from the allocated memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] data = CustomMemoryAllocator.&lt;span style=&#34;color:#bbb&#34;&gt;readData&lt;/span&gt;(address, 13); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Read 13 bytes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Data read from memory: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(data));
            
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Free the allocated memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            CustomMemoryAllocator.&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;(address);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Memory freed successfully.&amp;#34;&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed to allocate memory.&amp;#34;&lt;/span&gt;);
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In the above code we can see that we are storing the data and getting an address and if the memory allocation is successful then we write the data in the given address and then after reading it and printing it we deallocate the memory and clean it. This all are maintained by the run time and garbage collector.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 76: Implementing a dummy Service Oriented Architecture (SOA) service to Understand Java Service Provider Interface (SPI)</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day76/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day76/</id>
    <published>2024-01-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a dummy Service Oriented Architecture (SOA) service to Understand Java Service Provider Interface (SPI)</summary>
    <content type="html">&lt;p&gt;Service Provider Interface (SPI) that plays a pivotal role in enhancing modularity, extensibility, and maintainability of Java applications. In this blog post, we will delve into the intricacies of SPI, explore its real-world applications, and elucidate why it has become indispensable in modern software development.&lt;/p&gt;
&lt;h3 id=&#34;understanding-the-spi&#34;&gt;Understanding the SPI:&lt;/h3&gt;
&lt;p&gt;The Service Provider Interface is a framework in Java that facilitates the development of service-oriented architectures. At its core, SPI defines a contract between service providers and consumers, allowing for the dynamic loading of implementations without altering the client code. This decoupling of interface and implementation is instrumental in achieving modularity and fosters the creation of pluggable components within a software system.&lt;/p&gt;
&lt;p&gt;At the heart of SPI is the &lt;code&gt;java.util.ServiceLoader&lt;/code&gt; class, which acts as the service provider discovery mechanism. By employing SPI, developers can design extensible and modular systems that can be easily extended or modified without requiring changes to the existing codebase.&lt;/p&gt;
&lt;p&gt;Now let us understand what is Service Oriented Architecture (SOA) means:&lt;/p&gt;
&lt;h3 id=&#34;service-oriented-architecture-soa&#34;&gt;Service Oriented Architecture (SOA)&lt;/h3&gt;
&lt;p&gt;Service Oriented Architecture (SOA) is a design approach that structures software applications as a collection of services that are loosely coupled and interoperable. In SOA, services are self-contained, modular units that perform specific business functionalities and communicate with each other over a network. These services can be developed using different programming languages and technologies, as long as they agree upon to a common communication protocol, such as HTTP or SOAP.&lt;/p&gt;
&lt;p&gt;At the core of SOA is the concept of service autonomy, which means that each service is independent and can be developed, deployed, and scaled independently of other services. This enables greater flexibility and agility in software development, as changes or updates to one service do not require modifications to other services&lt;/p&gt;
&lt;h3 id=&#34;example&#34;&gt;Example:&lt;/h3&gt;
&lt;p&gt;Now for a real world example we will create a simple example of a service-oriented architecture using Java Service Provider Interface (SPI). In this example, we&amp;rsquo;ll develop a basic payment processing system with multiple payment gateways. The main application will be the client, and various payment gateways will act as service providers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;PaymentGateway&lt;/span&gt; { 
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount); 
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this will be the service interface.&lt;/p&gt;
&lt;p&gt;Now we will implement two Service Providers for this service interface and those are&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PayPal Service Provider&lt;/li&gt;
&lt;li&gt;Stripe Service Provider&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.HttpURLConnection&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URL&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;PayPalGateway&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; PaymentGateway {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String PAYPAL_API_ENDPOINT = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.paypal.com/processPayment&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Processing payment of $&amp;#34;&lt;/span&gt; + amount + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; using PayPal Gateway&amp;#34;&lt;/span&gt;);

    
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            URL url = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URL(PAYPAL_API_ENDPOINT);
            HttpURLConnection connection = (HttpURLConnection) url.&lt;span style=&#34;color:#bbb&#34;&gt;openConnection&lt;/span&gt;();
            connection.&lt;span style=&#34;color:#bbb&#34;&gt;setRequestMethod&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// logic
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; responseCode = connection.&lt;span style=&#34;color:#bbb&#34;&gt;getResponseCode&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (responseCode == HttpURLConnection.&lt;span style=&#34;color:#bbb&#34;&gt;HTTP_OK&lt;/span&gt;) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment processed successfully with PayPal&amp;#34;&lt;/span&gt;);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment processing failed with PayPal. Response code: &amp;#34;&lt;/span&gt; + responseCode);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error processing payment with PayPal: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now lets implement the Stripe Payment Service Provider&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.HttpURLConnection&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URL&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;StripeGateway&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; PaymentGateway {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String STRIPE_API_ENDPOINT = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.stripe.com/processPayment&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;processPayment&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Processing payment of $&amp;#34;&lt;/span&gt; + amount + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; using Stripe Gateway&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Call Stripe API to process the payment
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            URL url = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URL(STRIPE_API_ENDPOINT);
            HttpURLConnection connection = (HttpURLConnection) url.&lt;span style=&#34;color:#bbb&#34;&gt;openConnection&lt;/span&gt;();
            connection.&lt;span style=&#34;color:#bbb&#34;&gt;setRequestMethod&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; responseCode = connection.&lt;span style=&#34;color:#bbb&#34;&gt;getResponseCode&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (responseCode == HttpURLConnection.&lt;span style=&#34;color:#bbb&#34;&gt;HTTP_OK&lt;/span&gt;) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment processed successfully with Stripe&amp;#34;&lt;/span&gt;);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Payment processing failed with Stripe. Response code: &amp;#34;&lt;/span&gt; + responseCode);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Error processing payment with Stripe: &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now we need to configure the service provider by &lt;strong&gt;Service Provider Configuration: META-INF/services/com.example.PaymentGateway&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a file named &lt;code&gt;META-INF/services/com.example.PaymentGateway&lt;/code&gt; in your project resources. In this file, specify the fully qualified names of your payment gateway implementations like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;com.&lt;span style=&#34;color:#bbb&#34;&gt;example&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;PayPalGateway&lt;/span&gt; 
com.&lt;span style=&#34;color:#bbb&#34;&gt;example&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;StripeGateway&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now in the main class where we will call the Service providers using Service Loader&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ServiceLoader&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day76&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; amount = 100.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Payment amount
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Load payment gateways using ServiceLoader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        ServiceLoader&amp;lt;PaymentGateway&amp;gt; serviceLoader = ServiceLoader.&lt;span style=&#34;color:#bbb&#34;&gt;load&lt;/span&gt;(PaymentGateway.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Process payment using each loaded payment gateway
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (PaymentGateway paymentGateway : serviceLoader) {
            paymentGateway.&lt;span style=&#34;color:#bbb&#34;&gt;processPayment&lt;/span&gt;(amount);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, the &lt;code&gt;PaymentProcessor&lt;/code&gt; client application dynamically loads and utilizes different payment gateway implementations without having direct dependencies on them. The service provider configurations allow you to easily extend the system with new payment gateways by adding their implementations and updating the configuration file.&lt;/p&gt;
&lt;p&gt;But there are some pros and cons of SPI and knowing about those will help us correctly use this API&lt;/p&gt;
&lt;p&gt;The Java Service Provider Interface (SPI) is a mechanism that facilitates the development of service-oriented architectures by providing a way for services to be implemented and loaded dynamically at runtime. Like any technology, Java SPI comes with its own set of advantages and drawbacks. Let&amp;rsquo;s explore the pros and cons of using Java SPI:&lt;/p&gt;
&lt;h3 id=&#34;pros&#34;&gt;Pros:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4 id=&#34;dynamic-service-loading&#34;&gt;Dynamic Service Loading:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One of the primary advantages of Java SPI is its ability to dynamically load service implementations without modifying the client code. This promotes modularity and allows for the easy addition or removal of services during runtime, fostering flexibility in the application&amp;rsquo;s architecture.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;decoupling-of-components&#34;&gt;Decoupling of Components:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SPI enables a clear separation between service interfaces and their implementations. This decoupling ensures that changes to service implementations do not impact the client code, promoting a clean and modular design. It facilitates the creation of loosely coupled, pluggable components.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;easily-extensible&#34;&gt;Easily Extensible:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Java SPI provides an easy and standardized way to extend the functionality of an application. New service implementations can be added by creating a new provider class and updating the service provider configuration file without affecting existing code.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;collaboration-and-ecosystem&#34;&gt;Collaboration and Ecosystem:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SPI encourages collaboration among development teams by allowing them to provide and consume services independently. This collaborative nature fosters the creation of a rich ecosystem of interchangeable components and plugins.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;service-discovery&#34;&gt;Service Discovery:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;ServiceLoader&lt;/code&gt; class simplifies service discovery, making it straightforward for the application to locate and load available service implementations. This is especially beneficial in large-scale applications with numerous services.&lt;/p&gt;
&lt;h3 id=&#34;cons&#34;&gt;Cons:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4 id=&#34;limited-compile-time-checking&#34;&gt;Limited Compile-Time Checking:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since the service provider and implementation relationship is established at runtime, there is limited compile-time checking for correctness. This can lead to issues such as missing or incorrectly configured service providers, which may only become apparent during runtime.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;reflection-overhead&#34;&gt;Reflection Overhead:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Java SPI relies on reflection to load service implementations dynamically. Reflection can introduce runtime overhead, potentially affecting performance. However, the impact is generally minimal unless the application involves a large number of service providers.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;global-configuration-file&#34;&gt;Global Configuration File:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The service provider configuration file (&lt;code&gt;META-INF/services&lt;/code&gt;) is a global file that lists all available service implementations. In scenarios with multiple modules or libraries, conflicts may arise if different modules define service providers with the same fully qualified names.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;limited-metadata&#34;&gt;Limited Metadata:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SPI does not provide built-in support for metadata associated with service implementations. Developers might need to rely on conventions or additional mechanisms to convey metadata information about services.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;serviceloader-limitations&#34;&gt;ServiceLoader Limitations:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;ServiceLoader&lt;/code&gt; API has some limitations, such as a lack of support for specifying the order in which service providers should be loaded. This may be a concern in cases where the order of service providers is crucial.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 75: Java BufferedReader: Do We Know Why We Need To Close It?</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day75/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day75/</id>
    <published>2024-01-02T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Java Buffered Reader and why we need to close and what will happend if we dont</summary>
    <content type="html">&lt;p&gt;In this blog post, I will shine a spotlight on the significance of closing a Java BufferedReader after its creation, exploring the inner workings of BufferedReader, its implications, and offering practical insights to enhance your coding practices.&lt;/p&gt;
&lt;h3 id=&#34;understanding-bufferedreader&#34;&gt;Understanding BufferedReader:&lt;/h3&gt;
&lt;p&gt;Java&amp;rsquo;s BufferedReader class is a versatile tool for efficient reading of text from a character-based input stream. One of its defining features is the ability to buffer input, enhancing performance by reducing the number of I/O operations. While it offers enhanced reading capabilities, developers must exercise caution, ensuring that the BufferedReader is closed once its purpose is served.&lt;/p&gt;
&lt;h3 id=&#34;the-consequences-of-neglecting-closure&#34;&gt;The Consequences of Neglecting Closure:&lt;/h3&gt;
&lt;p&gt;Failing to close a BufferedReader can lead to resource leaks and adverse consequences for your application. Java&amp;rsquo;s garbage collector is responsible for reclaiming resources, but it may not be immediate or deterministic. A resource leak can accumulate over time, impacting the overall performance and reliability of your application. Furthermore, in scenarios where the code interacts with external systems or files, leaving the BufferedReader unclosed can lead to file locks and other resource contentions, causing unintended issues.&lt;/p&gt;
&lt;h3 id=&#34;performance-issues&#34;&gt;Performance Issues:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4 id=&#34;memory-usage&#34;&gt;Memory Usage:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An unclosed &lt;code&gt;BufferedReader&lt;/code&gt; can lead to increased memory usage over time. The buffer associated with the reader retains resources until the garbage collector decides to reclaim them. In the absence of explicit closure, these resources may persist longer than necessary, contributing to higher memory consumption.&lt;/p&gt;
&lt;p&gt;Now let us see a code example where not closing the BufferedReader can cause high memory usage.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day75&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        BufferedReader bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileReader(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;sample.txt&amp;#34;&lt;/span&gt;));
        StringBuilder content = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; StringBuilder();

        String line;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((line = bufferedReader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;()) != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            content.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(line).&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;lineSeparator&lt;/span&gt;());
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Imagine forgetting to close the BufferedReader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// bufferedReader.close(); // Uncommenting this line is crucial
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Do something with the content, if needed
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;File Content:\n&amp;#34;&lt;/span&gt; + content.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example we can see that after reading from the file if we dont close the buffered reader it will keep the reference of the buffered reader from getting garbage collected and thus will have the allocated memory intact, though we dont need the file data and buffered reader instance memory.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;file-descriptor-exhaustion&#34;&gt;File Descriptor Exhaustion:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let us first understand what a file descriptor is.&lt;/p&gt;
&lt;h5 id=&#34;file-descriptor-&#34;&gt;File Descriptor :&lt;/h5&gt;
&lt;p&gt;A file descriptor is a low-level integer value that uniquely identifies an open file within a process in a Unix-based operating system. It serves as a handle or reference to an open file or I/O resource, and it is used by the operating system to keep track of various properties and status information associated with the file.&lt;/p&gt;
&lt;p&gt;File descriptors are represented as non-negative integers. Standard input, output, and error have the file descriptor values 0, 1, and 2, respectively. Additional file descriptors are typically assigned starting from 3 and incrementing for each new open file.&lt;/p&gt;
&lt;p&gt;In Java, while the concept of file descriptors exists at the operating system level, Java itself abstracts many details through higher-level constructs like streams and readers/writers. When working with Java&amp;rsquo;s I/O classes, you often don&amp;rsquo;t directly deal with file descriptors, but the underlying operating system still manages them behind the scenes&lt;/p&gt;
&lt;p&gt;When dealing with file-based input streams, each open file consumes a file descriptor. Failing to close a &lt;code&gt;BufferedReader&lt;/code&gt; means leaving file descriptors unclosed. In scenarios where the application handles a large number of files or operates for an extended period, this can result in file descriptor exhaustion. Once the system runs out of available file descriptors, it may fail to open new files, causing unexpected errors and disruptions.&lt;/p&gt;
&lt;p&gt;Now let us see a code example for this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day75&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 1; i &amp;lt;= 1000; i++) {
            readFromFile(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt; + i + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.txt&amp;#34;&lt;/span&gt;);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;readFromFile&lt;/span&gt;(String filePath) {
        BufferedReader bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileReader(filePath));

            String line;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((line = bufferedReader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;()) != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Process the content (in this example, we are just printing it)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(line);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Missing: Properly close the BufferedReader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Uncomment the following line to avoid file descriptor exhaustion
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); }
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example:&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; method iterates over a range of file names (e.g., &amp;ldquo;file1.txt&amp;rdquo;, &amp;ldquo;file2.txt&amp;rdquo;, &amp;hellip;, &amp;ldquo;file1000.txt&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;readFromFile&lt;/code&gt; method is responsible for reading the content from each file using a &lt;code&gt;BufferedReader&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;BufferedReader&lt;/code&gt; is not properly closed in the &lt;code&gt;finally&lt;/code&gt; block, simulating a scenario where developers forget to close the resource.&lt;/p&gt;
&lt;p&gt;To see the impact of file descriptor exhaustion, you can run this program in an environment where there is a limit on the number of allowed open file descriptors. After running for some time, the program may encounter issues due to the exhaustion of file descriptors.&lt;/p&gt;
&lt;p&gt;To avoid file descriptor exhaustion, it&amp;rsquo;s crucial to close resources properly. Uncommenting the &lt;code&gt;bufferedReader.close();&lt;/code&gt; line in the &lt;code&gt;finally&lt;/code&gt; block ensures that the file descriptor associated with each &lt;code&gt;BufferedReader&lt;/code&gt; is released after reading from the file.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;resource-contention&#34;&gt;Resource Contention:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In cases where the code interacts with external resources, such as databases or network connections, leaving the &lt;code&gt;BufferedReader&lt;/code&gt; unclosed can lead to resource contention. This occurs when the resources are not released promptly, and subsequent operations may be delayed or blocked due to the lingering open connections.&lt;/p&gt;
&lt;p&gt;Resource contention occurs in computing when multiple processes or threads compete for access to a shared resource, and this competition leads to delays, reduced performance, or potential deadlocks. A shared resource can be any entity that is accessed or modified by multiple concurrent operations, such as files, database connections, network sockets, or even sections of memory.&lt;/p&gt;
&lt;p&gt;Now let us see a code example&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day75&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String FILE_PATH = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;shared-file.txt&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create two threads that read from the same file
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Thread thread1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; readFromFile());
        Thread thread2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; readFromFile());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Start the threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        thread1.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        thread2.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;readFromFile&lt;/span&gt;() {
        BufferedReader bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileReader(FILE_PATH));

            String line;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((line = bufferedReader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;()) != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate reading from the file (e.g., processing the line)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + line);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Missing: Properly close the BufferedReader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Uncomment the following line to avoid resource contention
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); }
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; method creates two threads (&lt;code&gt;thread1&lt;/code&gt; and &lt;code&gt;thread2&lt;/code&gt;) that concurrently attempt to read from the same file (&lt;code&gt;shared-file.txt&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;readFromFile&lt;/code&gt; method is responsible for reading the content from the file using a &lt;code&gt;BufferedReader&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;BufferedReader&lt;/code&gt; is not properly closed in the &lt;code&gt;finally&lt;/code&gt; block, simulating a scenario where developers forget to close the resource, leading to resource contention.&lt;/p&gt;
&lt;p&gt;To observe the resource contention, run this program and observe the empty output from both threads. Uncommenting the &lt;code&gt;bufferedReader.close();&lt;/code&gt; line in the &lt;code&gt;finally&lt;/code&gt; block ensures that the resource contention is mitigated by properly closing the &lt;code&gt;BufferedReader&lt;/code&gt;. Without proper closure, multiple threads may interfere with each other, leading to unpredictable and undesirable outcomes.&lt;/p&gt;
&lt;h3 id=&#34;resource-leaks&#34;&gt;Resource Leaks:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4 id=&#34;file-locks&#34;&gt;File Locks:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When reading from files, especially in a multi-threaded environment, failing to close a &lt;code&gt;BufferedReader&lt;/code&gt; can result in file locks not being released. This is critical because file locks prevent other processes or threads from accessing the file. Over time, accumulating file locks due to unclosed readers can lead to contention and potential deadlock situations.&lt;/p&gt;
&lt;p&gt;In the above example of Resource contention can generate file locks that will prevent other instances of buffered reader to get the file to read.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;h4 id=&#34;network-resource-leaks&#34;&gt;Network Resource Leaks:&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When dealing with network-related input streams, such as reading from a URL, leaving the &lt;code&gt;BufferedReader&lt;/code&gt; unclosed can result in resource leaks in the network stack. This may lead to issues such as connection leaks, where network resources are not released promptly, affecting the application&amp;rsquo;s ability to establish new connections.&lt;/p&gt;
&lt;p&gt;Now let us see a code example for this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.InputStreamReader&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URL&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;NetworkResourceLeakExample&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String URL_STRING = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://www.example.com&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create two threads that read from the same URL
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Thread thread1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; readFromURL());
        Thread thread2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; readFromURL());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Start the threads
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        thread1.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        thread2.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;readFromURL&lt;/span&gt;() {
        BufferedReader bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            URL url = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URL(URL_STRING);
            bufferedReader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InputStreamReader(url.&lt;span style=&#34;color:#bbb&#34;&gt;openStream&lt;/span&gt;()));

            String line;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((line = bufferedReader.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;()) != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Simulate reading from the URL (e.g., processing the line)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt; + line);
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;finally&lt;/span&gt; {
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Missing: Properly close the BufferedReader
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Uncomment the following line to avoid network resource leak
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); }
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;main&lt;/code&gt; method creates two threads (&lt;code&gt;thread1&lt;/code&gt; and &lt;code&gt;thread2&lt;/code&gt;) that concurrently attempt to read from the same URL (&lt;code&gt;https://www.example.com&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;readFromURL&lt;/code&gt; method is responsible for reading the content from the URL using a &lt;code&gt;BufferedReader&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;BufferedReader&lt;/code&gt; is not properly closed in the &lt;code&gt;finally&lt;/code&gt; block, simulating a scenario where developers forget to close the resource, leading to a potential network resource leak.&lt;/p&gt;
&lt;p&gt;To observe the potential network resource leak, run this program and observe the interleaved output from both threads. Uncommenting the &lt;code&gt;bufferedReader.close();&lt;/code&gt; line in the &lt;code&gt;finally&lt;/code&gt; block ensures that the network resource leak is mitigated by properly closing the &lt;code&gt;BufferedReader&lt;/code&gt;. Without proper closure, multiple threads may interfere with each other, leading to unpredictable and undesirable outcomes when reading from the shared network resource.&lt;/p&gt;
&lt;p&gt;In essence, proper closure of the &lt;code&gt;BufferedReader&lt;/code&gt; is essential for efficient resource management. By closing the reader explicitly, developers release system resources promptly, preventing memory bloat, file descriptor exhaustion, and resource contention. Failure to do so can lead to a cascade of performance issues and resource leaks that, although subtle, can have a significant impact on the reliability and efficiency of the Java application over time.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 74: Java Security: Crafting a toy TLS Server with Java Security API</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day74/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day74/</id>
    <published>2023-12-12T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding how Symmetric and Asymmetric encryption works using Java Cryptography Extension</summary>
    <content type="html">&lt;p&gt;In the vast realm of Java programming, security is not just a feature; it&amp;rsquo;s a necessity. In this article, we&amp;rsquo;ll embark on a journey to explore the intricate world of Java security by crafting a toy TLS server using the Java Security API. Buckle up as we delve into the nuts and bolts of secure communication!&lt;/p&gt;
&lt;h3 id=&#34;setting-the-stage&#34;&gt;Setting the Stage&lt;/h3&gt;
&lt;p&gt;Before we dive into the code, let&amp;rsquo;s set the stage. Understanding the basics of TLS (Transport Layer Security) is crucial. We&amp;rsquo;ll discuss why secure communication is essential and lay the groundwork for our TLS server.&lt;/p&gt;
&lt;h2 id=&#34;tls&#34;&gt;TLS&lt;/h2&gt;
&lt;p&gt;Transport Layer Security (TLS) is a cryptographic protocol that ensures privacy and data integrity between two communicating applications over a network. It is widely used to secure communication over the internet, particularly in web browsers accessing websites, email communication, and other applications that require secure data transmission.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an overview of how TLS works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Handshake Protocol:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ClientHello:&lt;/strong&gt; The process begins with the client sending a &amp;ldquo;Hello&amp;rdquo; message to the server, specifying the supported cryptographic algorithms and other parameters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ServerHello:&lt;/strong&gt; The server responds with its own &amp;ldquo;Hello&amp;rdquo; message, selecting a cryptographic algorithm and other parameters from the client&amp;rsquo;s list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Exchange:&lt;/strong&gt; The server provides its public key to the client, and they agree on a pre-master secret, which will be used to generate encryption keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1702372982/images-from-blog/b83b75dbbf5b7e4be31c8000f91fc1a8_jcozjd.svg&#34; alt=&#34;TLS Handshake&#34;  /&gt;
&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key Exchange:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client encrypts the pre-master secret using the server&amp;rsquo;s public key and sends it back to the server.&lt;/li&gt;
&lt;li&gt;Both the client and server independently generate a session key from the pre-master secret.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The server may provide a digital certificate to prove its identity. The client verifies the certificate&amp;rsquo;s authenticity using a trusted Certificate Authority (CA).&lt;/li&gt;
&lt;li&gt;Optionally, the client may also provide its own certificate for server authentication.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Session Key Establishment:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client and server use the agreed-upon session key to generate encryption keys for securing the data transmission.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secure Data Transmission:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With the session keys established, the client and server use symmetric encryption to secure the data exchanged during the session.&lt;/li&gt;
&lt;li&gt;TLS provides confidentiality by encrypting the data, integrity by using Message Authentication Codes (MACs), and authenticity through digital certificates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Finished:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Both the client and server send a &amp;ldquo;Finished&amp;rdquo; message to confirm that the handshake is complete. The encrypted session is now established.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-tls-uses-key-pair&#34;&gt;How TLS uses Key Pair&lt;/h3&gt;
&lt;p&gt;TLS uses key pairs, consisting of a public key and a private key, to secure communications over the internet. These keys serve various purposes during the TLS handshake process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server Authentication:&lt;/strong&gt; The server presents its public key certificate during the handshake to prove its identity. The client can verify the server&amp;rsquo;s authenticity using a trusted Certificate Authority&amp;rsquo;s public key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client Authentication (Optional):&lt;/strong&gt; In cases requiring mutual authentication, the client also presents its public key certificate to the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key Exchange:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TLS employs asymmetric key exchange algorithms to establish a shared secret key between the client and server. The public keys in the key pairs facilitate a secure exchange, ensuring that eavesdroppers cannot intercept the shared secret.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Encryption:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once the shared secret is established, symmetric encryption algorithms are used for efficient data encryption. The security of the initial key exchange, facilitated by the key pairs, is crucial for protecting the confidentiality and integrity of the transmitted data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Perfect Forward Secrecy (PFS):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TLS emphasizes Perfect Forward Secrecy, ensuring that compromising long-term private keys does not compromise past communications. Key pairs play a role in achieving PFS, especially with algorithms supporting forward secrecy. %%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tls-in-java&#34;&gt;TLS In Java&lt;/h2&gt;
&lt;p&gt;In Java, TLS is typically implemented using the Java Secure Socket Extension (JSSE) framework, which provides the necessary classes for secure communication.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s see how can we construct and toy TLS server and understand how it works&lt;/p&gt;
&lt;h2 id=&#34;code-crafting-begins&#34;&gt;Code Crafting Begins&lt;/h2&gt;
&lt;p&gt;Now, the real fun begins. We&amp;rsquo;ll start coding our toy TLS server step by step. From setting up the server socket to handling client connections, we&amp;rsquo;ll navigate the Java Security API to ensure our server stands robust in the face of potential threats.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.net.ssl.*&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.security.cert.CertificateException&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedReader&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileInputStream&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.InputStreamReader&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.PrintWriter&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.KeyManagementException&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.KeyStore&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.KeyStoreException&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.NoSuchAlgorithmException&lt;/span&gt;;  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.UnrecoverableKeyException&lt;/span&gt;;  
  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day74&lt;/span&gt; {  
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {  
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {  
            SSLContext sslContext = SSLContext.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TLS&amp;#34;&lt;/span&gt;);  
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(KeyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getDefaultAlgorithm&lt;/span&gt;());  
            KeyStore keyStore = KeyStore.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;JKS&amp;#34;&lt;/span&gt;);  
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;char&lt;/span&gt;[] password = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;javaSecurityDay74&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;toCharArray&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your keystore password  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            keyStore.&lt;span style=&#34;color:#bbb&#34;&gt;load&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;keystore.jks&amp;#34;&lt;/span&gt;), password); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your keystore file path  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            keyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(keyStore, password);  
            sslContext.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(keyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getKeyManagers&lt;/span&gt;(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);  
  
            SSLServerSocketFactory sslServerSocketFactory = sslContext.&lt;span style=&#34;color:#bbb&#34;&gt;getServerSocketFactory&lt;/span&gt;();  
            SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.&lt;span style=&#34;color:#bbb&#34;&gt;createServerSocket&lt;/span&gt;(8888); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your preferred port  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;  
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Server started. Waiting for client connection...&amp;#34;&lt;/span&gt;);  
  
            SSLSocket sslSocket = (SSLSocket) sslServerSocket.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;();  
  
            BufferedReader in = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InputStreamReader(sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;()));  
            PrintWriter out = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PrintWriter(sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;getOutputStream&lt;/span&gt;(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);  
  
            String clientMessage = in.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;();  
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Client message: &amp;#34;&lt;/span&gt; + clientMessage);  
  
            out.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello, Client!&amp;#34;&lt;/span&gt;);  
  
            in.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
            out.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
            sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
            sslServerSocket.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (NoSuchAlgorithmException | KeyManagementException | IOException | KeyStoreException |  
                 UnrecoverableKeyException | java.&lt;span style=&#34;color:#bbb&#34;&gt;security&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;cert&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;CertificateException&lt;/span&gt; e) {  
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();  
        }  
    }  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;ssl-context&#34;&gt;SSL Context&lt;/h3&gt;
&lt;p&gt;Now lets understand the above code step by step to get understanding how it&amp;rsquo;s communicating using TLS&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    SSLContext sslContext = SSLContext.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;TLS&amp;#34;&lt;/span&gt;);
    sslContext.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(keyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getKeyManagers&lt;/span&gt;(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here we are instantiating &lt;code&gt;SSLContext&lt;/code&gt; which is the main api that&amp;rsquo;s driving the security of the communication. We are requesting  the SSLContext with &lt;code&gt;&amp;quot;TLS&amp;quot;&lt;/code&gt; and then initializing it with KeyManagers from keyManager factory. Now let us understand what is KeyManagerFactory&lt;/p&gt;
&lt;h3 id=&#34;keymanager-and-keystore&#34;&gt;KeyManager and KeyStore&lt;/h3&gt;
&lt;p&gt;In Java, a &lt;code&gt;KeyManager&lt;/code&gt; is part of the Java Secure Socket Extension (JSSE) and is responsible for managing key materials for key exchange during SSL/TLS communication. It works in conjunction with &lt;code&gt;TrustManager&lt;/code&gt; and &lt;code&gt;SecureRandom&lt;/code&gt; to provide a comprehensive security framework for Java applications.&lt;/p&gt;
&lt;p&gt;In Java, a &lt;code&gt;KeyStore&lt;/code&gt; is a repository that stores cryptographic keys and their associated X.509 certificate chains. It is a fundamental component of the Java Cryptography Architecture (JCA) and is used for managing cryptographic keys, certificates, and related information in a secure manner. The &lt;code&gt;KeyStore&lt;/code&gt; class is part of the &lt;code&gt;java.security&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;KeyStores are commonly used in various security-related operations, such as SSL/TLS communication, code signing, and digital signatures.&lt;/p&gt;
&lt;p&gt;Now lets instantiate a KeyManager and then use keystore to store the keypair&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;KeyManagerFactory keyManagerFactory = KeyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(KeyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getDefaultAlgorithm&lt;/span&gt;());  
KeyStore keyStore = KeyStore.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;JKS&amp;#34;&lt;/span&gt;);  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;char&lt;/span&gt;[] password = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;javaSecurityDay74&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;toCharArray&lt;/span&gt;(); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your keystore password  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;keyStore.&lt;span style=&#34;color:#bbb&#34;&gt;load&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;keystore.jks&amp;#34;&lt;/span&gt;), password); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your keystore file path  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;keyManagerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(keyStore, password);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here we are instantiating KeyManagerFactory which manages keyStores which in turns manages keypair. Here we are creating a key manager by pointing it to an already created keystore and then initializing it.&lt;/p&gt;
&lt;h4 id=&#34;keypair-generation&#34;&gt;KeyPair Generation&lt;/h4&gt;
&lt;p&gt;Keys are the backbone of encryption. We&amp;rsquo;ll explore the art of KeyPair generation. To generate key pair we need to create a keystore as keys and certificates are stored inside the keystore.&lt;/p&gt;
&lt;p&gt;To generate a Java KeyStore (JKS) file, you can use the &lt;code&gt;keytool&lt;/code&gt; command-line utility that comes with the Java Development Kit (JDK). Below is an example command to generate a simple self-signed certificate and store it in a JKS file named &lt;code&gt;keystore.jks&lt;/code&gt;. This example uses a 2048-bit RSA key for simplicity:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;keytool -genkeypair -keyalg RSA -keysize &lt;span style=&#34;color:#3677a9&#34;&gt;2048&lt;/span&gt; -alias mykey -keystore keystore.jks -validity &lt;span style=&#34;color:#3677a9&#34;&gt;365&lt;/span&gt; -keypass keyPassword -storepass keystorePassword -dname &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;CN=MyKey, OU=MyOrganizationalUnit, O=MyOrganization, L=MyCity, ST=MyState, C=MyCountry&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this command does the following&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-genkeypair&lt;/code&gt;: Generates a key pair (public and private keys).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keyalg RSA&lt;/code&gt;: Specifies the key algorithm (RSA in this case).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keysize 2048&lt;/code&gt;: Specifies the key size (2048 bits in this case).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-alias mykey&lt;/code&gt;: Specifies the alias for the key pair.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keystore keystore.jks&lt;/code&gt;: Specifies the name of the keystore file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-validity 365&lt;/code&gt;: Specifies the validity period of the key pair in days.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keypass keyPassword&lt;/code&gt;: Specifies the password for the private key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-storepass keystorePassword&lt;/code&gt;: Specifies the password for the keystore.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-dname &amp;quot;CN=MyKey, OU=MyOrganizationalUnit, O=MyOrganization, L=MyCity, ST=MyState, C=MyCountry&amp;quot;&lt;/code&gt;: Specifies the distinguished name (DN) for the certificate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After running this command, you will have a &lt;code&gt;keystore.jks&lt;/code&gt; file in your working directory. Remember to replace placeholder values (like passwords and distinguished name) with your own values.&lt;/p&gt;
&lt;h3 id=&#34;ssl-server-socket-setup&#34;&gt;SSL Server Socket Setup&lt;/h3&gt;
&lt;p&gt;An SSL Server Socket, or SSLServerSocket, is a class in Java that represents a server-side endpoint for SSL/TLS-secured communication. It is part of the Java Secure Socket Extension (JSSE) and is used for establishing secure connections between servers and clients over a network.&lt;/p&gt;
&lt;p&gt;here we are creating a SSLServerSocketFactory that will provide us with a server socket connection. Then we configure the socket with which port it will listen. In this example I have selected &lt;code&gt;8888&lt;/code&gt; as the port. The SSLServer will listen on this port. Furthermore we call &lt;code&gt;accept()&lt;/code&gt; on SSLServerSocket which will now accept connections.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;	SSLServerSocketFactory sslServerSocketFactory =  sslContext.&lt;span style=&#34;color:#bbb&#34;&gt;getServerSocketFactory&lt;/span&gt;();  
	SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.&lt;span style=&#34;color:#bbb&#34;&gt;createServerSocket&lt;/span&gt;(8888); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Replace with your preferred port  
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;  
	System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Server started. Waiting for client connection...&amp;#34;&lt;/span&gt;);  
  
	SSLSocket sslSocket = (SSLSocket) sslServerSocket.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;();  
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;input-and-output-stream-setup&#34;&gt;Input and Output Stream Setup&lt;/h3&gt;
&lt;p&gt;After that we setup input and output stream for incoming and sending data back to client. SSLServerSocket includes an InputStream which alongside with a reader we can get client data and show it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;BufferedReader in = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; InputStreamReader(sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;()));  
PrintWriter out = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; PrintWriter(sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;getOutputStream&lt;/span&gt;(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);  
  
String clientMessage = in.&lt;span style=&#34;color:#bbb&#34;&gt;readLine&lt;/span&gt;();  
System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Client message: &amp;#34;&lt;/span&gt; + clientMessage);  
  
out.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello, Client!&amp;#34;&lt;/span&gt;);  
  
in.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
out.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
sslSocket.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();  
sslServerSocket.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;to learn more about tls &lt;a href=&#34;https://hpbn.co/transport-layer-security-tls/&#34;&gt;https://hpbn.co/transport-layer-security-tls/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 73: Java Security: Safeguarding Data with Encryption and Keys</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day73/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day73/</id>
    <published>2023-09-11T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding how Symmetric and Asymmetric encryption works using Java Cryptography Extension</summary>
    <content type="html">&lt;p&gt;The Java Cryptography Extension (JCE) is a framework that provides cryptographic functionality within the Java platform. It offers a set of APIs, algorithms, and services for various cryptographic operations, including encryption, decryption, digital signatures, key management, and more. I will discuss in a 3 part series about the details of&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Encryption and Decryption using Java&lt;/li&gt;
&lt;li&gt;Digital Signatures&lt;/li&gt;
&lt;li&gt;KeyManagement and why we need it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So in the first part let us dive into the Encryption using AES algorithm by using some already prebuilt java apis.&lt;/p&gt;
&lt;h3 id=&#34;encryption-and-decryption&#34;&gt;Encryption and Decryption:&lt;/h3&gt;
&lt;p&gt;JCE allows you to perform encryption and decryption using symmetric and asymmetric encryption algorithms. So we should understand brefily about symmetric and asymmetirc encryption.&lt;/p&gt;
&lt;h4 id=&#34;symmetric-encryption&#34;&gt;Symmetric Encryption&lt;/h4&gt;
&lt;p&gt;Symmetric Encryption is a type of encryption where only one key (a secret key) is used to both encrypt and decrypt electronic data. The entities communicating via symmetric encryption must exchange the key so that it can be used in the decryption process. This encryption method differs from asymmetric encryption where a pair of keys - one public and one private - is used to encrypt and decrypt messages.
By using symmetric encryption algorithms, data is &amp;ldquo;scrambled&amp;rdquo; so that it can&amp;rsquo;t be understood by anyone who does not possess the secret key to decrypt it. Once the intended recipient who possesses the key has the message, the algorithm reverses its action so that the message is returned to its original readable form. The secret key that the sender and recipient both use could be a specific password/code or it can be random string of letters or numbers that have been generated by a secure random number generator (RNG).&lt;/p&gt;
&lt;p&gt;Code Example - Symmetric Encryption (AES):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.crypto.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.Key&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.NoSuchAlgorithmException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day73&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Generate a secret key
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        KeyGenerator keyGenerator = KeyGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;AES&amp;#34;&lt;/span&gt;);
        keyGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(128);
        SecretKey secretKey = keyGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;generateKey&lt;/span&gt;();

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Initialize the cipher for encryption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Cipher cipher = Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;AES&amp;#34;&lt;/span&gt;);
        cipher.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;ENCRYPT_MODE&lt;/span&gt;, secretKey);

        String plaintext = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Sensitive information&amp;#34;&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] encrypted = cipher.&lt;span style=&#34;color:#bbb&#34;&gt;doFinal&lt;/span&gt;(plaintext.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;());

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Encrypted: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(encrypted));

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Initialize the cipher for decryption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        cipher.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;DECRYPT_MODE&lt;/span&gt;, secretKey);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] decrypted = cipher.&lt;span style=&#34;color:#bbb&#34;&gt;doFinal&lt;/span&gt;(encrypted);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Decrypted: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(decrypted));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now in this example we can see some java api&amp;rsquo;s. Specifically &lt;code&gt;KeyGenerator&lt;/code&gt;, &lt;code&gt;SecretKey&lt;/code&gt; and &lt;code&gt;Cipher&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;java-has-a-keygenerator-class-&#34;&gt;Java has a KeyGenerator class :&lt;/h5&gt;
&lt;p&gt;This class is designed to generate secret (symmetric) keys, offering the capabilities of a key generator. You can create KeyGenerator instances using any of the getInstance methods provided by this class.&lt;/p&gt;
&lt;p&gt;KeyGenerator instances can be used multiple times; that is, once a key has been created, the same KeyGenerator can be used to create more keys.&lt;/p&gt;
&lt;p&gt;There are two methods to create a key: one that is algorithm-independent, and another that is specific to an algorithm. The only distinction between these two methods is how the object is initialized. For the algorithm specific ones the java platform provides some algorithms we can choose from and they are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AES (128)&lt;/li&gt;
&lt;li&gt;DES (56)&lt;/li&gt;
&lt;li&gt;DESede (168)&lt;/li&gt;
&lt;li&gt;HmacSHA1&lt;/li&gt;
&lt;li&gt;HmacSHA256&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cipher class gives us the option to select the algorithms that we want to use to encrypt or decrypt. In our case we have chosen AES as algorithm to encrypt by initializing once as &lt;code&gt;ENCRYPT_MODE&lt;/code&gt; and when decrypting as &lt;code&gt;DECRYPT_MODE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To learn more about AES and how it works watch this &lt;a href=&#34;https://www.youtube.com/watch?v=O4xNJsjtN6E&amp;amp;t=2s&#34;&gt;AES Explained (Advanced Encryption Standard)  - Computerphile&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;asymmetric-encryption&#34;&gt;Asymmetric Encryption&lt;/h4&gt;
&lt;p&gt;Asymmetric encryption, also known as public-key cryptography, is a cryptographic system that uses a pair of keys - a public key and a private key - to encrypt and decrypt data. These keys are mathematically related but cannot be derived from one another. The public key is used to encrypt data, while the private key is used to decrypt the data. This system allows for secure communication without the need for the sender and receiver to share the same key beforehand.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how asymmetric encryption works: Asymmetric encryption, also known as public-key cryptography, is a method of encrypting and decrypting information using a pair of keys: a public key and a private key. It provides a secure way to transmit sensitive data over insecure channels, such as the internet. Here&amp;rsquo;s a simple example for software developers:&lt;/p&gt;
&lt;p&gt;Imagine two people, Alice and Bob, who want to communicate securely over an insecure channel. Both Alice and Bob have a pair of keys, one public and one private.&lt;/p&gt;
&lt;h5 id=&#34;key-generation&#34;&gt;Key Generation:&lt;/h5&gt;
&lt;p&gt;Alice generates a public-private key pair. She keeps her private key secret and shares her public key with Bob. Similarly, Bob does the same and shares his public key with Alice.&lt;/p&gt;
&lt;h5 id=&#34;encryption&#34;&gt;Encryption:&lt;/h5&gt;
&lt;p&gt;If Alice wants to send a confidential message to Bob, she uses Bob&amp;rsquo;s public key to encrypt the message. This encrypted message can only be decrypted using Bob&amp;rsquo;s private key.&lt;/p&gt;
&lt;h5 id=&#34;decryption&#34;&gt;Decryption:&lt;/h5&gt;
&lt;p&gt;When Bob receives the encrypted message, he uses his private key to decrypt it. Only Bob possesses the private key necessary to unlock the message encrypted with his public key.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.crypto.Cipher&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.security.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Base64&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day73&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Generate Key Pair
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        KeyPair keyPair = generateKeyPair();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(keyPair.&lt;span style=&#34;color:#bbb&#34;&gt;getPrivate&lt;/span&gt;());
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(keyPair.&lt;span style=&#34;color:#bbb&#34;&gt;getPublic&lt;/span&gt;());

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Message to be encrypted
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String originalMessage = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello, this is a secret message!&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Encryption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String encryptedMessage = encrypt(originalMessage, keyPair.&lt;span style=&#34;color:#bbb&#34;&gt;getPublic&lt;/span&gt;());

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Original Message: &amp;#34;&lt;/span&gt; + originalMessage);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Encrypted Message: &amp;#34;&lt;/span&gt; + encryptedMessage);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Decryption
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String decryptedMessage = decrypt(encryptedMessage, keyPair.&lt;span style=&#34;color:#bbb&#34;&gt;getPrivate&lt;/span&gt;());

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Decrypted Message: &amp;#34;&lt;/span&gt; + decryptedMessage);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; KeyPair &lt;span style=&#34;color:#447fcf&#34;&gt;generateKeyPair&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;RSA&amp;#34;&lt;/span&gt;);
        keyPairGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;initialize&lt;/span&gt;(4096);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; keyPairGenerator.&lt;span style=&#34;color:#bbb&#34;&gt;generateKeyPair&lt;/span&gt;();
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;encrypt&lt;/span&gt;(String plaintext, PublicKey publicKey) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        Cipher encryptCipher = Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;RSA&amp;#34;&lt;/span&gt;);
        encryptCipher.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;ENCRYPT_MODE&lt;/span&gt;, publicKey);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] cipherText = encryptCipher.&lt;span style=&#34;color:#bbb&#34;&gt;doFinal&lt;/span&gt;(plaintext.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;());
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Base64.&lt;span style=&#34;color:#bbb&#34;&gt;getEncoder&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;encodeToString&lt;/span&gt;(cipherText);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;decrypt&lt;/span&gt;(String encryptedText, PrivateKey privateKey) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        Cipher decriptCipher = Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;RSA&amp;#34;&lt;/span&gt;);
        decriptCipher.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;(Cipher.&lt;span style=&#34;color:#bbb&#34;&gt;DECRYPT_MODE&lt;/span&gt;, privateKey);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] decryptedText = decriptCipher.&lt;span style=&#34;color:#bbb&#34;&gt;doFinal&lt;/span&gt;(Base64.&lt;span style=&#34;color:#bbb&#34;&gt;getDecoder&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;decode&lt;/span&gt;(encryptedText));
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(decryptedText);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now lets see how this code does that&lt;/p&gt;
&lt;h3 id=&#34;key-pair-generation&#34;&gt;Key Pair Generation:&lt;/h3&gt;
&lt;p&gt;The generateKeyPair() method uses the KeyPairGenerator class to create a new key pair for encryption and decryption. It initializes the key pair generator with the RSA algorithm and a key size of 2048 bits.&lt;/p&gt;
&lt;h3 id=&#34;encryption-1&#34;&gt;Encryption:&lt;/h3&gt;
&lt;p&gt;The encrypt() method takes a plaintext message and a public key as input. It initializes a Cipher object for encryption using the RSA algorithm. The method then encrypts the plaintext message using the provided public key and returns the encrypted message as a Base64-encoded string.&lt;/p&gt;
&lt;h3 id=&#34;decryption-1&#34;&gt;Decryption:&lt;/h3&gt;
&lt;p&gt;The decrypt() method takes the encrypted text and the corresponding private key as input. It initializes a Cipher object for decryption using the RSA algorithm. The method then decrypts the Base64-encoded encrypted text using the provided private key and returns the decrypted message as a string.&lt;/p&gt;
&lt;p&gt;In the main method, a new key pair is generated. The original plaintext message is encrypted using the public key from the generated key pair. The encrypted message is then printed to the console. Next, the encrypted message is decrypted using the private key from the same key pair, and the decrypted message is printed to the console.&lt;/p&gt;
&lt;p&gt;The example demonstrates how to securely encrypt and decrypt messages using asymmetric encryption with the RSA algorithm in Java. The Base64 class is used to encode and decode byte arrays as strings to ensure that the encrypted and decrypted messages can be properly handled as strings.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 72: Can a HashMap Take Null or Empty String as a Key in Java?</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day72/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day72/</id>
    <published>2023-07-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Can a HashMap Take Null as a Key in Java?</summary>
    <content type="html">&lt;p&gt;While working with a problem I came upon an intriguing question. Can a HashMap Take Null or Empty String as a Key in Java?. If possible how does it translate to the serialization and how popular libraries will handle this situation.&lt;/p&gt;
&lt;p&gt;Before starting let us understand how does HashMap works in java. Sepcifically we will focus on the part of how it creates a hash for the hashmap.&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-hashmap&#34;&gt;What is a Hashmap&lt;/h3&gt;
&lt;p&gt;At the core of HashMap is the concept of hashing. When you put a key-value pair into a HashMap, the key is first hashed to determine its storage location within the underlying array. The hash code is an integer value computed from the key&amp;rsquo;s contents using the key&amp;rsquo;s &lt;code&gt;hashCode()&lt;/code&gt; method.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now a question arises. Do null have a hashcode?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lets see&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Objects.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;));
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here I am using the native Objects class which havea hashCode(). It can create hash for the given object. In this case this method will return 0 for null.&lt;/p&gt;
&lt;p&gt;In jdk source code for HashMap class one can see that below method is implemented with the hashCode() method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;hashCode&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Objects.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;(key) ^ Objects.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;(value);
        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this method calculates the hash code for a key-value pair by combining the hash codes of both the key and the value using the bitwise XOR (^) operation. The &lt;code&gt;Objects.hashCode()&lt;/code&gt; method is used to obtain the hash codes for the key and value, and then they are XORed together to produce a single hash code.&lt;/p&gt;
&lt;p&gt;So its returning a valid integer that will point to the bucket where the value will be stored. In this case what is a bucket? A bucket is a position in the underlying array, and multiple key-value pairs with the same hash code are stored in the same bucket as a linked list (known as a collision chain).&lt;/p&gt;
&lt;p&gt;Now let us understand a little bit more about how this hash and storing works.&lt;/p&gt;
&lt;h3 id=&#34;hashmap-internal-array&#34;&gt;HashMap Internal Array&lt;/h3&gt;
&lt;p&gt;Internally, a HashMap uses an array to store its elements. The size of this array is initially set to a default capacity, but it dynamically resizes and rehashes its elements as necessary to maintain efficient performance.&lt;/p&gt;
&lt;p&gt;When a key-value pair is added to the HashMap, the key&amp;rsquo;s hash code is used to compute an index in the array. If the bucket at that index is empty, the key-value pair is stored there. If there is already a key-value pair(s) in the bucket due to a hash code collision, the new key-value pair is linked to the existing ones as a part of the linked list.&lt;/p&gt;
&lt;h3 id=&#34;hash-collision-handling&#34;&gt;Hash Collision Handling&lt;/h3&gt;
&lt;p&gt;Hash collisions occur when two different keys have the same hash code. In such cases, multiple key-value pairs are stored in the same bucket as a linked list. To find the correct value associated with a key during retrieval, the HashMap traverses the linked list (collision chain) until it finds the key or reaches the end of the chain.&lt;/p&gt;
&lt;p&gt;To improve performance and minimize the impact of hash collisions, it&amp;rsquo;s crucial to have a good hash function that evenly distributes hash codes across the array. The ideal hash function produces distinct hash codes for distinct keys while avoiding excessive collisions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So back to the question from this we can understand that null can be a valid key for an Hashmap&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also its mention in the documenation of &lt;a href=&#34;https://github.com/openjdk/jdk/blob/c22cadf32fbfa206f089c9d73c3b7f3db069d47a/src/java.base/share/classes/java/util/HashMap.java#L43&#34;&gt;JDK&lt;/a&gt;. Now lets see can empty string can be a valid key.&lt;/p&gt;
&lt;p&gt;As an empty string still and String object in java so it will generate a valid hashcode when we do&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;());
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Similar to null it will generate a valid hashcode. By the way if you run both &amp;quot;&amp;quot; and null in &lt;code&gt;Objects.hashCode()&lt;/code&gt; it will return 0 as int. From the code of &lt;code&gt;Objects.hashCode()&lt;/code&gt; we can see why.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;hashCode&lt;/span&gt;(Object o) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; o != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ? o.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;() : 0;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Also from the hashCode implementation of string we can see&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;hashCode&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; h = hash; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// hash by default 0
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (h == 0 &amp;amp;&amp;amp; value.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt; &amp;gt; 0) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;char&lt;/span&gt; val[] = value;

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; value.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; h;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;when the string is empty then it will return 0.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 71: Understanding Heap poullion in java and its causes and how to prevent it</title>
    <link href="https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day71/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/posts/java/100daysofjava/day71/</id>
    <published>2023-06-09T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding Heap poullion in java and its causes and how to prevent it</summary>
    <content type="html">&lt;p&gt;Java is a statically typed language that provides type safety to ensure that variables are used consistently and correctly. However, there are cases where type safety can be compromised, leading to unexpected behavior and runtime errors. One such scenario is heap pollution. In this blog post, we will explore the concept of Java heap pollution, understand why it happens, learn how to detect it, and discuss potential solutions to mitigate its risks.&lt;/p&gt;
&lt;h3 id=&#34;what-is-java-heap-pollution&#34;&gt;What is Java Heap Pollution?&lt;/h3&gt;
&lt;p&gt;Heap pollution occurs in Java when a variable of a parameterized type references an object of an incompatible type. It results in the introduction of elements into a parameterized type structure that violate its type constraints, compromising type safety.&lt;/p&gt;
&lt;h3 id=&#34;why-does-heap-pollution-happen&#34;&gt;Why Does Heap Pollution Happen?&lt;/h3&gt;
&lt;p&gt;Heap pollution can happen due to several reasons:&lt;/p&gt;
&lt;h4 id=&#34;incompatible-assignments&#34;&gt;Incompatible Assignments:&lt;/h4&gt;
&lt;p&gt;Heap pollution can occur when assigning objects of incompatible types to variables of parameterized types. For example, assigning a List&lt;!-- raw HTML omitted --&gt; to a List&lt;!-- raw HTML omitted --&gt; variable.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say you have a method that accepts a List&lt;!-- raw HTML omitted --&gt; parameter and attempts to add elements from a source list to it. However, if the source list is a List&lt;!-- raw HTML omitted --&gt;, heap pollution occurs. Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;addElementsToList&lt;/span&gt;(List&amp;lt;Object&amp;gt; destinationList, List&amp;lt;?&amp;gt; sourceList) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Object obj : sourceList) {
        destinationList.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(obj); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Heap pollution occurs here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Usage
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;List&amp;lt;String&amp;gt; stringList = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;World&amp;#34;&lt;/span&gt;);
List&amp;lt;Object&amp;gt; objectList = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
addElementsToList(objectList, stringList); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Heap pollution occurs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this case, the attempt to add String objects to a List&lt;!-- raw HTML omitted --&gt; leads to heap pollution. The type safety is compromised, and unexpected behavior can occur when accessing elements from the objectList.&lt;/p&gt;
&lt;h4 id=&#34;unchecked-type-conversions&#34;&gt;Unchecked Type Conversions:&lt;/h4&gt;
&lt;p&gt;Improper unchecked type conversions can introduce heap pollution. When casting objects to parameterized types without proper type checks, the wrong types can be assigned, leading to heap pollution. Consider the following example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;cast&lt;/span&gt;(Object obj) {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (T) obj; &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Heap pollution occurs here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Usage
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;List&amp;lt;Integer&amp;gt; integerList = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
List rawList = integerList;
List&amp;lt;String&amp;gt; stringList = cast(rawList); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Heap pollution occurs
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this case, the cast method attempts to perform an unchecked type conversion of a raw list to a list of strings. This unchecked conversion introduces heap pollution, as the list contains integer elements but is cast to a string list, potentially causing type safety violations and unexpected behavior.&lt;/p&gt;
&lt;h4 id=&#34;varargs-and-generics&#34;&gt;Varargs and Generics:&lt;/h4&gt;
&lt;p&gt;Varargs methods combined with generics can also introduce heap pollution. When invoking varargs methods with incompatible types, heap pollution can occur. Consider the following example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@SafeVarargs&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;createList&lt;/span&gt;(T... elements) {
    List&amp;lt;T&amp;gt; list = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (T element : elements) {
        list.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(element); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Heap pollution occurs here
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; list;
}

&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Usage
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;List&amp;lt;String&amp;gt; stringList = createList(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;World&amp;#34;&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Although the createList method is annotated with &lt;code&gt;@SafeVarargs&lt;/code&gt;, indicating it is safe from heap pollution, it can still be misused. If the method is invoked with incompatible types, such as &lt;code&gt;createList(&amp;quot;Hello&amp;quot;, 42)&lt;/code&gt;, heap pollution occurs, leading to potential runtime errors when accessing the elements of the list.&lt;/p&gt;
&lt;h3 id=&#34;detecting-heap-pollution&#34;&gt;Detecting Heap Pollution:&lt;/h3&gt;
&lt;p&gt;Detecting heap pollution can be challenging since it often leads to runtime errors rather than compilation errors. However, there are some approaches to detect heap pollution:&lt;/p&gt;
&lt;h4 id=&#34;compiler-warnings&#34;&gt;Compiler Warnings:&lt;/h4&gt;
&lt;p&gt;Enable compiler warnings using the -Xlint:unchecked flag. This provides warnings about potential heap pollution issues during compilation, giving you a chance to review and address them.&lt;/p&gt;
&lt;h4 id=&#34;static-code-analysis-tools&#34;&gt;Static Code Analysis Tools:&lt;/h4&gt;
&lt;p&gt;Utilize static code analysis tools that can detect potential heap pollution issues. These tools analyze your code and provide suggestions for improvements to prevent heap pollution scenarios.&lt;/p&gt;
&lt;h3 id=&#34;solving-heap-pollution&#34;&gt;Solving Heap Pollution:&lt;/h3&gt;
&lt;p&gt;To mitigate the risks associated with heap pollution, consider the following solutions:&lt;/p&gt;
&lt;h4 id=&#34;use-parameterized-types-correctly&#34;&gt;Use Parameterized Types Correctly:&lt;/h4&gt;
&lt;p&gt;Ensure that parameterized types are used consistently and correctly throughout your code. Avoid situations where variables of parameterized types reference objects of incompatible types.&lt;/p&gt;
&lt;h4 id=&#34;enable-compiler-warnings-and-annotations&#34;&gt;Enable Compiler Warnings and Annotations:&lt;/h4&gt;
&lt;p&gt;Enable compiler warnings to get notified about potential heap pollution issues during compilation. Use the @SuppressWarnings(&amp;ldquo;unchecked&amp;rdquo;) annotation to suppress warnings for well-understood and intentional heap pollution cases.&lt;/p&gt;
&lt;h4 id=&#34;validate-and-filter-input&#34;&gt;Validate and Filter Input:&lt;/h4&gt;
&lt;p&gt;Validate and filter input data to ensure type compatibility and prevent incompatible objects from entering a parameterized type structure. Perform necessary type checks before performing type conversions or assignments.&lt;/p&gt;
&lt;h4 id=&#34;design-patterns-and-best-practices&#34;&gt;Design Patterns and Best Practices:&lt;/h4&gt;
&lt;p&gt;Apply design patterns, such as the Factory pattern or Builder pattern, to encapsulate object creation and ensure type safety. Follow best practices for generic programming to promote type safety and avoid heap pollution scenarios.&lt;/p&gt;
&lt;h4 id=&#34;testing-and-code-reviews&#34;&gt;Testing and Code Reviews:&lt;/h4&gt;
&lt;p&gt;Thoroughly test your code, including scenarios that involve parameterized types, to uncover potential heap pollution issues. Conduct code reviews to identify and address any heap pollution concerns.&lt;/p&gt;
&lt;p&gt;Java heap pollution can introduce type safety violations and unexpected behavior in your code. By understanding the causes, detecting heap pollution, and applying appropriate solutions, you can mitigate the risks and ensure type safety. It is essential to use parameterized types correctly, enable compiler warnings, validate input, follow best practices, conduct thorough testing, and engage in code reviews to prevent heap pollution scenarios.&lt;/p&gt;
&lt;p&gt;By prioritizing type safety and being vigilant about potential heap pollution, you can write more robust and reliable Java code.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 70:Diving deep into Array copy- Measuring Array Copy Performance in Java with JMH: A Comparative Analysis of Methods</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day70/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day70/</id>
    <published>2023-04-15T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Measuring the performance of different array copying methods in Java using JMH</summary>
    <content type="html">&lt;p&gt;In software engineering, optimizing the performance of an application is crucial for delivering a high-quality user experience. One area where performance optimizations can make a significant impact is in the manipulation of arrays. Efficient array copying operations can lead to faster execution times and better application performance.&lt;/p&gt;
&lt;p&gt;This is where the Java Microbenchmark Harness (JMH) library comes in handy. JMH is a benchmarking tool designed specifically for measuring the performance of Java code. In this article, we will use JMH to measure the performance of various array copying methods.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ArrayCopyBenchmarks&lt;/span&gt; {
    &lt;span style=&#34;color:#ffa500&#34;&gt;@State&lt;/span&gt;(Scope.&lt;span style=&#34;color:#bbb&#34;&gt;Benchmark&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ArrState&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] arr = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[3000];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] arr2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[3000];

        &lt;span style=&#34;color:#ffa500&#34;&gt;@Setup&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setup&lt;/span&gt;() {
            Random random = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random();
            Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;fill&lt;/span&gt;(arr, random.&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;());
        }
    }
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//@Benchmark
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;loopCopy&lt;/span&gt;(ArrState state) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] arr2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[30];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
            arr2[i] = state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;[i];
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; arr2;
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//@Benchmark
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;systemArraysCopy&lt;/span&gt;(ArrState state) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] arr2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[30];
        System.&lt;span style=&#34;color:#bbb&#34;&gt;arraycopy&lt;/span&gt;(state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;, 0, arr2, 0, state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; arr2;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;systemArraysCopyToExistingArray&lt;/span&gt;(ArrState state) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;arraycopy&lt;/span&gt;(state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;, 0, state.&lt;span style=&#34;color:#bbb&#34;&gt;arr2&lt;/span&gt;, 0, state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; state.&lt;span style=&#34;color:#bbb&#34;&gt;arr2&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;loopCopyToExistingArray&lt;/span&gt;(ArrState state) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
            state.&lt;span style=&#34;color:#bbb&#34;&gt;arr2&lt;/span&gt;[i] = state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;[i];
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; state.&lt;span style=&#34;color:#bbb&#34;&gt;arr2&lt;/span&gt;;
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//@Benchmark
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;[] &lt;span style=&#34;color:#447fcf&#34;&gt;arraysCopy&lt;/span&gt;(ArrState state) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;copyOf&lt;/span&gt;(state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;, state.&lt;span style=&#34;color:#bbb&#34;&gt;arr&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        runBenchmark(ArrayCopyBenchmarks.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s start by taking a look at the Java code provided above. The code defines a class called &lt;strong&gt;&lt;code&gt;ArrayCopyBenchmarks&lt;/code&gt;&lt;/strong&gt; which contains several methods for copying arrays. These methods include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;loopCopy&lt;/code&gt;&lt;/strong&gt;: This method uses a simple loop to copy the contents of one array to another.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;systemArraysCopy&lt;/code&gt;&lt;/strong&gt;: This method uses the &lt;strong&gt;&lt;code&gt;System.arraycopy&lt;/code&gt;&lt;/strong&gt; method to copy the contents of one array to another.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;systemArraysCopyToExistingArray&lt;/code&gt;&lt;/strong&gt;: This method uses the &lt;strong&gt;&lt;code&gt;System.arraycopy&lt;/code&gt;&lt;/strong&gt; method to copy the contents of one array to an existing array.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;loopCopyToExistingArray&lt;/code&gt;&lt;/strong&gt;: This method uses a simple loop to copy the contents of one array to an existing array.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;arraysCopy&lt;/code&gt;&lt;/strong&gt;: This method uses the &lt;strong&gt;&lt;code&gt;Arrays.copyOf&lt;/code&gt;&lt;/strong&gt; method to copy the contents of one array to another.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these methods is annotated with the &lt;strong&gt;&lt;code&gt;@Benchmark&lt;/code&gt;&lt;/strong&gt; annotation, which tells JMH to measure their execution time.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;main&lt;/code&gt;&lt;/strong&gt; method of the &lt;strong&gt;&lt;code&gt;ArrayCopyBenchmarks&lt;/code&gt;&lt;/strong&gt; class uses the &lt;strong&gt;&lt;code&gt;runBenchmark&lt;/code&gt;&lt;/strong&gt; method to run the benchmarks and display the results. When you run the program, JMH will execute each benchmark method several times and report the average execution time.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s look at the results of the benchmarks. We can see that the &lt;strong&gt;&lt;code&gt;systemArraysCopy&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;systemArraysCopyToExistingArray&lt;/code&gt;&lt;/strong&gt; methods are the fastest, followed by the &lt;strong&gt;&lt;code&gt;arraysCopy&lt;/code&gt;&lt;/strong&gt; method. The &lt;strong&gt;&lt;code&gt;loopCopy&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;loopCopyToExistingArray&lt;/code&gt;&lt;/strong&gt; methods are the slowest.&lt;/p&gt;
&lt;p&gt;These results tell us that the &lt;strong&gt;&lt;code&gt;System.arraycopy&lt;/code&gt;&lt;/strong&gt; method is the most efficient way to copy arrays in Java. It is faster than using a loop or the &lt;strong&gt;&lt;code&gt;Arrays.copyOf&lt;/code&gt;&lt;/strong&gt; method. Additionally, the &lt;strong&gt;&lt;code&gt;systemArraysCopyToExistingArray&lt;/code&gt;&lt;/strong&gt; method is faster than creating a new array and copying the contents of the old array to it.&lt;/p&gt;
&lt;p&gt;In conclusion, optimizing array copying operations can have a significant impact on application performance. By using JMH to measure the performance of different array copying methods, we can determine which method is the most efficient. In this case, the &lt;strong&gt;&lt;code&gt;System.arraycopy&lt;/code&gt;&lt;/strong&gt; method is the clear winner. By incorporating this method into your code, you can improve the performance of your Java applications.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 69 : Unlocking Java Performance Secrets: Harnessing the Power of JMH Microbenchmarking</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day69/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day69/</id>
    <published>2023-04-05T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Exploring benchmarking harness in Java and how its use to understand performance</summary>
    <content type="html">&lt;p&gt;Java Microbenchmark Harness (JMH) is a Java library used to measure the performance of Java code snippets, methods, and classes. It is a useful tool for developers who want to optimize their Java applications, identify performance bottlenecks, and compare the performance of different implementations.&lt;/p&gt;
&lt;p&gt;JMH provides a simple API for developers to write benchmarks and test their performance. In this blog post, we will explore the basics of JMH and how to write and run benchmarks using JMH.&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-benchmark-harness&#34;&gt;What is a Benchmark Harness:&lt;/h3&gt;
&lt;p&gt;A benchmark harness is a software that provides the infrastructure to conduct benchmarks of a software and/or hardware system, typically with the goal to quantitatively assess the system&amp;rsquo;s characteristics and capabilities or to compare the characteristics and capabilities of multiple systems relative to each other&lt;/p&gt;
&lt;h3 id=&#34;what-is-jmh&#34;&gt;What is JMH:&lt;/h3&gt;
&lt;p&gt;JMH is built on top of the Java Virtual Machine&amp;rsquo;s (JVM) HotSpot compiler infrastructure. It uses the Just-In-Time (JIT) compiler to optimize code at runtime, which means that the code is executed multiple times before the actual benchmark is run. This ensures that the benchmark results are accurate and consistent.&lt;/p&gt;
&lt;p&gt;To achieve this, JMH generates a benchmarking harness that consists of a loop that executes the benchmark method multiple times. This loop is called a &amp;ldquo;measurement iteration&amp;rdquo; and it is executed several times to ensure that the benchmark results are reliable.&lt;/p&gt;
&lt;h3 id=&#34;jmh-execution-lifecyle&#34;&gt;JMH Execution Lifecyle&lt;/h3&gt;
&lt;p&gt;we&amp;rsquo;ll explore the different phases of the JMH execution lifecycle and what happens during each phase.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1681057025/images-from-blog/JMH_uiajzf.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Fig: JMH&lt;/p&gt;
&lt;h4 id=&#34;setup-phase&#34;&gt;Setup Phase&lt;/h4&gt;
&lt;p&gt;The first phase of the JMH execution lifecycle is the setup phase. During this phase, JMH initializes the benchmark state and sets up the environment for the benchmark. The &lt;code&gt;@Setup&lt;/code&gt; annotation can be used to define a method that will be executed during this phase.&lt;/p&gt;
&lt;h4 id=&#34;warmup-phase&#34;&gt;Warmup Phase&lt;/h4&gt;
&lt;p&gt;The next phase is the warmup phase. During this phase, JMH runs the benchmark method multiple times to allow the JVM to warm up and optimize the code. The &lt;code&gt;@Warmup&lt;/code&gt; annotation can be used to control the duration of the warmup phase and the number of iterations to run.&lt;/p&gt;
&lt;h4 id=&#34;measurement-phase&#34;&gt;Measurement Phase&lt;/h4&gt;
&lt;p&gt;The measurement phase is the main benchmarking phase. During this phase, JMH measures the performance of the benchmark method. The @Benchmark annotation is used to mark the method to be benchmarked. JMH runs the benchmark method for a configurable number of iterations and measures the execution time of each iteration.&lt;/p&gt;
&lt;h4 id=&#34;iteration-tear-down-phase&#34;&gt;Iteration Tear Down Phase&lt;/h4&gt;
&lt;p&gt;After each iteration of the benchmark method, JMH executes any methods annotated with &lt;code&gt;@TearDownIteration&lt;/code&gt;. This can be used to clean up any resources or reset the state of the benchmark.&lt;/p&gt;
&lt;h4 id=&#34;result-aggregation-phase&#34;&gt;Result Aggregation Phase&lt;/h4&gt;
&lt;p&gt;After all iterations have completed, JMH aggregates the results and computes statistics such as the mean, standard deviation, and confidence intervals. This provides a summary of the benchmark results.&lt;/p&gt;
&lt;h4 id=&#34;benchmark-tear-down-phase&#34;&gt;Benchmark Tear Down Phase&lt;/h4&gt;
&lt;p&gt;Finally, JMH executes any methods annotated with &lt;code&gt;@TearDown&lt;/code&gt; after the benchmark has completed. This can be used to release any resources or perform any necessary cleanup.&lt;/p&gt;
&lt;h3 id=&#34;setting-up-jmh&#34;&gt;Setting up JMH&lt;/h3&gt;
&lt;p&gt;Before we dive into writing benchmarks, we need to set up JMH in our project. JMH can be easily added to your project by adding the following dependency to your Maven or Gradle build file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- Maven dependency --&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.openjdk.jmh&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jmh-core&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.34&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&amp;lt;!-- Gradle dependency --&amp;gt;&lt;/span&gt;
    compile &amp;#39;org.openjdk.jmh:jmh-core:1.34&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;writing-a-simple-benchmark&#34;&gt;Writing a simple benchmark&lt;/h3&gt;
&lt;p&gt;To write a benchmark using JMH, we need to create a class and annotate it with &lt;strong&gt;&lt;code&gt;@BenchmarkMode&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;@OutputTimeUnit&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;@State&lt;/code&gt;&lt;/strong&gt; annotations. The &lt;strong&gt;&lt;code&gt;@BenchmarkMode&lt;/code&gt;&lt;/strong&gt; annotation specifies the benchmark mode, the &lt;strong&gt;&lt;code&gt;@OutputTimeUnit&lt;/code&gt;&lt;/strong&gt; annotation specifies the time unit to use for reporting, and the &lt;strong&gt;&lt;code&gt;@State&lt;/code&gt;&lt;/strong&gt; annotation specifies the state of the benchmark.&lt;/p&gt;
&lt;p&gt;Here is an example of a simple benchmark that measures the performance of adding two integers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.Benchmark&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.BenchmarkMode&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.Mode&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.OutputTimeUnit&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.State&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.annotations.Scope&lt;/span&gt;;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.TimeUnit&lt;/span&gt;;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@State&lt;/span&gt;(Scope.&lt;span style=&#34;color:#bbb&#34;&gt;Thread&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@BenchmarkMode&lt;/span&gt;(Mode.&lt;span style=&#34;color:#bbb&#34;&gt;AverageTime&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@OutputTimeUnit&lt;/span&gt;(TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;AddBenchmark&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; a = 1;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; b = 2;
    
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Benchmark&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;add&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; a + b;
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this benchmark, we have annotated the class with &lt;strong&gt;&lt;code&gt;@State(Scope.Thread)&lt;/code&gt;&lt;/strong&gt; to indicate that the state of the benchmark is local to each thread, &lt;strong&gt;&lt;code&gt;@BenchmarkMode(Mode.AverageTime)&lt;/code&gt;&lt;/strong&gt; to indicate that we want to measure the average time taken by the benchmark, and &lt;strong&gt;&lt;code&gt;@OutputTimeUnit(TimeUnit.NANOSECONDS)&lt;/code&gt;&lt;/strong&gt; to indicate that we want to report the results in nanoseconds.&lt;/p&gt;
&lt;p&gt;The benchmark method is annotated with &lt;strong&gt;&lt;code&gt;@Benchmark&lt;/code&gt;&lt;/strong&gt;, which indicates that this is the method that we want to measure. In this case, we are measuring the time taken to add two integers.&lt;/p&gt;
&lt;h3 id=&#34;running-a-benchmark&#34;&gt;Running a benchmark&lt;/h3&gt;
&lt;p&gt;To run a benchmark, we can create an instance of the &lt;strong&gt;&lt;code&gt;org.openjdk.jmh.runner.Runner&lt;/code&gt;&lt;/strong&gt; class and pass it the class that contains the benchmark. Here is an example of how to run the &lt;strong&gt;&lt;code&gt;AddBenchmark&lt;/code&gt;&lt;/strong&gt; class we just created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.runner.Runner&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.runner.RunnerException&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.runner.options.Options&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.openjdk.jmh.runner.options.OptionsBuilder&lt;/span&gt;;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Main&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; RunnerException {
            Options options = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OptionsBuilder()
                    .&lt;span style=&#34;color:#bbb&#34;&gt;include&lt;/span&gt;(AddBenchmark.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getSimpleName&lt;/span&gt;())
                    .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Runner(options).&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;();
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we have created an instance of the &lt;strong&gt;&lt;code&gt;OptionsBuilder&lt;/code&gt;&lt;/strong&gt; class and used it to specify the benchmark class that we want to run. We then create an instance of the &lt;strong&gt;&lt;code&gt;Runner&lt;/code&gt;&lt;/strong&gt; class and pass it the options we just created.&lt;/p&gt;
&lt;p&gt;For further learning Jenkov has a great tutorial about it. &lt;a href=&#34;https://jenkov.com/tutorials/java-performance/jmh.html&#34;&gt;https://jenkov.com/tutorials/java-performance/jmh.html&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 68 : Becoming a memory plumber; A tale of Memory Leak and how to find them ( part 3)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day68/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day68/</id>
    <published>2023-03-30T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding and finding the causes and types of memory leaks and tools and suggestions to fix them</summary>
    <content type="html">&lt;p&gt;Analyzing for memory leaks in Java involves identifying objects that are no longer being used by the program but are still being held in memory. which can cause memory usage to increase over time and potentially lead to out-of-memory errors. Here are the steps for analyzing and identifying memory leaks in Java:&lt;/p&gt;
&lt;h3 id=&#34;identify-the-symptoms&#34;&gt;Identify the symptoms:&lt;/h3&gt;
&lt;p&gt;The first step in analyzing for memory leaks is to identify the symptoms of the issue, such as out-of-memory errors or increasing memory usage over time.&lt;/p&gt;
&lt;h3 id=&#34;gather-data&#34;&gt;Gather data:&lt;/h3&gt;
&lt;p&gt;Once the symptoms have been identified, gather data on the application&amp;rsquo;s memory usage. This can be done using tools such as Java&amp;rsquo;s built-in JMX monitoring, VisualVM or JConsole. JFR is another tool to get events and data that is occuring in the jvm. Java Mission Control provides these data. There are some other tools in this page mentioned below&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.oracle.com/javase/9/troubleshoot/diagnostic-tools.htm#JSTGD117&#34; title=&#34;https://docs.oracle.com/javase/9/troubleshoot/diagnostic-tools.htm#JSTGD117&#34;&gt;https://docs.oracle.com/javase/9/troubleshoot/diagnostic-tools.htm#JSTGD117&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-heap-dumps&#34;&gt;Create heap dumps:&lt;/h3&gt;
&lt;p&gt;At first lets learn what is heap dump.&lt;/p&gt;
&lt;h4 id=&#34;heap-dumps-&#34;&gt;Heap dumps :&lt;/h4&gt;
&lt;p&gt;The term Heapdump describes &lt;strong&gt;the JVM mechanism that generates a dump of all the live objects that are on the Java™ heap&lt;/strong&gt;, which are being used by the running Java application. There are two dump formats, the text or classic heap dump format and the Portable Heap Dump (PHD) format.&lt;/p&gt;
&lt;p&gt;Create heap dumps at regular intervals or when the application experiences an out-of-memory error. Heap dumps can be analyzed using tools like Eclipse Memory Analyzer (MAT) or VisualVM.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1679904629/images-from-blog/Screenshot_2023-03-20_232646_hztwtf.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Fig 1: VisualVM&lt;/p&gt;
&lt;h3 id=&#34;analyze-heap-dumps&#34;&gt;Analyze heap dumps&lt;/h3&gt;
&lt;p&gt;Analyze the heap dumps to identify the objects that are being held in memory but are no longer being used by the application. MAT and VisualVM can help identify the root cause of memory leaks. Below is the snap for MAT where a heap dump file is loaded&lt;/p&gt;
&lt;p&gt;Java heap dumps can be analyzed using various tools, such as Eclipse Memory Analyzer (MAT) and VisualVM.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.einfochips.com/blog/wp-content/uploads/2016/06/figure3.png&#34; alt=&#34;Preventing Server Crashes and Memory Leakage with Eclipse Memory Analyzer  Tool (MAT)&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Fig 2: Eclipse MAT&lt;/p&gt;
&lt;p&gt;Here are the general steps for analyzing Java heap dumps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Capture the heap dump: Heap dumps can be captured using command-line tools like jmap or via the application itself (if it supports such functionality). Heap dumps can also be automatically captured when the application experiences an OutOfMemoryError.&lt;/li&gt;
&lt;li&gt;Load the heap dump into the analysis tool: After capturing the heap dump, load it into an analysis tool like Eclipse Memory Analyzer (MAT) or VisualVM. Both tools have built-in heap dump analysis capabilities.&lt;/li&gt;
&lt;li&gt;Analyze the heap dump: Use the analysis tool to explore the heap dump and identify potential memory leaks. The analysis tool will provide information about the objects in the heap, their sizes, and the relationships between them.&lt;/li&gt;
&lt;li&gt;Identify the root cause: Use the analysis tool to identify the root cause of the memory leak. This may involve identifying objects that are not being garbage collected, objects that are unnecessarily retained in memory, or objects that are being excessively created.&lt;/li&gt;
&lt;li&gt;Take action: Once the root cause has been identified, take action to address the issue. This may involve modifying the code to properly release resources, updating third-party libraries, or tuning the JVM settings to better manage memory.&lt;/li&gt;
&lt;li&gt;Verify the fix: After making the necessary changes, verify that the memory leak has been fixed and the application is functioning correctly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Overall, analyzing Java heap dumps requires a deep understanding of the application&amp;rsquo;s memory usage patterns and the tools used for heap dump analysis. By following these general steps, developers can identify and address memory leaks in their Java applications.&lt;/p&gt;
&lt;h3 id=&#34;identify-the-cause&#34;&gt;Identify the cause:&lt;/h3&gt;
&lt;p&gt;Once the objects causing the memory leaks have been identified, determine the root cause of the issue. This may involve reviewing the code to identify incorrect memory management practices or third-party libraries causing the issue.&lt;/p&gt;
&lt;h3 id=&#34;fix-the-issue&#34;&gt;Fix the issue:&lt;/h3&gt;
&lt;p&gt;Fix the issue by correcting the root cause. This may involve modifying the code to properly release resources, updating third-party libraries, or tuning the JVM settings to better manage memory.&lt;/p&gt;
&lt;h3 id=&#34;test&#34;&gt;Test:&lt;/h3&gt;
&lt;p&gt;Test the application to ensure that the memory leak has been fixed and that the application is functioning correctly.&lt;/p&gt;
&lt;p&gt;By following these steps, developers can identify and address memory leaks in their Java applications. Regular monitoring and analysis can help prevent memory leaks from becoming a significant issue in production environments.&lt;/p&gt;
&lt;h3 id=&#34;analyze-for-finding-memory-leaks&#34;&gt;Analyze for finding Memory leaks&lt;/h3&gt;
&lt;p&gt;In order analyze whether your program contains any potential Memory Leaks you will need some kind specialized tools like&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HeapHero&lt;/li&gt;
&lt;li&gt;JProfiler&lt;/li&gt;
&lt;li&gt;VisualVM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;these allow you view what exactly happening under hood during runtime &amp;amp; identify problematic areas ahead time before problems start manifesting themselves on production environment.&lt;/p&gt;
&lt;p&gt;In the case I was working, we started looking into which classes were taking much memory and thread execution as well. Then exported a heap dump and analyzed it with Eclipse MAT and isolated the class which was an old version of a library.&lt;/p&gt;
&lt;h3 id=&#34;steps-to-prevent-memory-leaks&#34;&gt;Steps to prevent Memory leaks&lt;/h3&gt;
&lt;p&gt;To prevent Memory Leaks occurring its important ensure all resources get closed properly at end each operation ; try avoid creating too many temporary variables unnecessarily &amp;amp; keep track object lifetime create them only necessary basis then dispose off quickly once done with it ; finally make sure Garbage Collector running correctly so old unused objects get cleared up regularly thus freeing up valuable system resources&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 67: Becoming a memory plumber; A tale of Memory Leak and how to find them ( part 2)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day67/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day67/</id>
    <published>2023-01-21T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding and finding the causes and types of memory leaks and tools and suggestions to fix them</summary>
    <content type="html">&lt;p&gt;In my previous post  I briefly discussed about few types of memory leaks. In todays post going to further discuss about six other scenarios which can cause memory leaks. They are&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unclosed resource&lt;/li&gt;
&lt;li&gt;custom equals and hashcode implementation&lt;/li&gt;
&lt;li&gt;Inner class that references outer classes&lt;/li&gt;
&lt;li&gt;Finalization bug&lt;/li&gt;
&lt;li&gt;Thread local&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;unclosed-resources&#34;&gt;Unclosed Resources&lt;/h3&gt;
&lt;p&gt;Unclosed resource memory leak in Java occurs when an application fails to release resources such as file handles, sockets, and database connections after they are no longer needed. These unclosed resources can remain allocated for extended periods of time resulting in a gradual buildup of system memory. This type of leak is particularly dangerous because it often goes unnoticed until the system runs out of available RAM or disk space.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getSaleResults&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
        URL url = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URL(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;http://api.com/saleResutlts&amp;#34;&lt;/span&gt;);
        URLConnection urlConnection = url.&lt;span style=&#34;color:#bbb&#34;&gt;openConnection&lt;/span&gt;();
        InputStream is = urlConnection.&lt;span style=&#34;color:#bbb&#34;&gt;getInputStream&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] bytes = is.&lt;span style=&#34;color:#bbb&#34;&gt;readAllBytes&lt;/span&gt;();
    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException ioe) {
        ioe.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;so to resolve this we should use &lt;code&gt;try-with-resource&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Java developers must be aware that any code which opens external resources such as files or databases should ensure that these are properly closed once their use has concluded. Failure to do so will result in a slow but steady increase in the amount of used memory on the system over time which can eventually lead to performance issues or even complete failure due to lack of available RAM and/or disk space on the machine hosting your application&amp;rsquo;s process(es).&lt;/p&gt;
&lt;h3 id=&#34;custom-equals-and-hashcode-implementation&#34;&gt;Custom .equals() and .hashCode() implementation&lt;/h3&gt;
&lt;p&gt;Custom .equals() and .hashCode() implementation can cause memory leaks in Java due to the way they are used. When a class implements these methods, it is responsible for managing its own state and ensuring that all objects of the same type have unique references. If this is not done properly, an object can be created but never garbage collected because it will always exist as a reference from another object or collection. This leads to more objects staying in memory than necessary which causes a gradual increase in system resources over time until eventually there is no longer enough available for other tasks leading to poor performance or even crashing of the application.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see an example scenario, In HashSet and HashMap &lt;code&gt;.equals()&lt;/code&gt; and &lt;code&gt;.hashCode()&lt;/code&gt;uses these methods in many operations, and if they&amp;rsquo;re not overridden correctly, they can become a source for potential memory leak problems.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SaleResult&lt;/span&gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; saleCount;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isSuccess;
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SaleResult&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; saleCount, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isSuccess) {
    	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;saleCount&lt;/span&gt; = saleCount;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;isSuccess&lt;/span&gt; = isSuccess;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now if we set this object as key in a hashmap or hashset and if a string id for value of the cusomterId we would need to ensure they are unique as HashMap and HashSet dont allow duplicate keys.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Map&amp;lt;SaleResult, Long&amp;gt; map = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i=0; i&amp;lt;10000; i++) {
	map.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jon&amp;#34;&lt;/span&gt;), 1);
}
System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(map.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here we will see 1000 objects are being inserted and thus the size of the map is 1000. Here we&amp;rsquo;re using SaleReuslt as a key. Since Map doesn&amp;rsquo;t allow duplicate keys, the numerous duplicate SaleResult objects that we inserted as a key shouldn&amp;rsquo;t increase the memory.&lt;/p&gt;
&lt;p&gt;But since we haven&amp;rsquo;t defined the proper equals() method, the duplicate objects pile up and increase the memory, which is why we see more than one object in the memory.&lt;/p&gt;
&lt;p&gt;However, if we&amp;rsquo;d overridden the equals() and hashCode() methods properly, then only one Person object would exist in this Map. Let&amp;rsquo;s take a look at the proper implementations of equals() and hashCode() for our SaleResult class:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SaleResult&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; id;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isSuccess;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SaleResult&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; id, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isSuccess) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt; = id;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;isSuccess&lt;/span&gt; = isSuccess;
        }

      &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;equals&lt;/span&gt;(Object o) {
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (o == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!(o &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; SaleResult)) {
              &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
          }
          SaleResult result = (SaleResult) o;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; result.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt; == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;;
      }

      &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;hashCode&lt;/span&gt;() {
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = 7;
          hash = 31 * hash + id;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; hash;
      }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now after this there will be only 1 instance of &lt;code&gt;SaleResult&lt;/code&gt; in the hashmap after insert.&lt;/p&gt;
&lt;h3 id=&#34;inner-class-that-references-outer-classes&#34;&gt;Inner class that references outer classes&lt;/h3&gt;
&lt;p&gt;This happens in the case of non-static inner classes (anonymous classes). For initialization, these inner classes always require an instance of the enclosing class. This type of leak occurs when the inner class holds a reference to the outer class. which prevents the garbage collector from reclaiming any memory associated with outer instance. This causes significant performance degradation and even application crashes if not addressed properly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SaleResult&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; saleCount;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SaleResult&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; saleCount) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;saleCount&lt;/span&gt; = saleCount;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SaleData&lt;/span&gt; {

        }

        SaleData &lt;span style=&#34;color:#447fcf&#34;&gt;getSaleData&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SaleData();
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now if we run this program like this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day67&lt;/span&gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String args[]) {
    	List&amp;lt;SaleResult.&lt;span style=&#34;color:#bbb&#34;&gt;SaleData&lt;/span&gt;&amp;gt; saleResults = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt;(infiniteLoopFlag) { &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// for analyzing the program
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        	saleResults.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SaleResult(10).&lt;span style=&#34;color:#bbb&#34;&gt;getSaleData&lt;/span&gt;()):
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;the inner class &lt;code&gt;SaleData&lt;/code&gt; will keep the reference of the Outer class &lt;code&gt;SaleResult&lt;/code&gt; thus causing memory not to be GC.&lt;/p&gt;
&lt;p&gt;Inner classes are useful for organizing code better, but it is important to consider their impact on memory management when using them in your program design. The best way to prevent this type of issue is through &lt;code&gt;proper usage of weak references&lt;/code&gt; within the inner class implementation or using &lt;code&gt;static&lt;/code&gt; classes. so that it does not maintain a strong reference back up into its parent or containing object graph structure while still providing access as needed at runtime.&lt;/p&gt;
&lt;h3 id=&#34;using-finalization&#34;&gt;Using finalization&lt;/h3&gt;
&lt;p&gt;Sometimes using &lt;code&gt;finalize()&lt;/code&gt; can cause memory leaks. Whenever a classes &lt;code&gt;finalize()&lt;/code&gt; method is overridden, then objects of that class aren&amp;rsquo;t instantly garbage collected. Instead, the GC queues them for finalization, which occurs at a later point in time.&lt;/p&gt;
&lt;p&gt;Additionally, if the code written in the finalize() method isn&amp;rsquo;t optimal, and if the finalizer queue can&amp;rsquo;t keep up with the Java garbage collector, then sooner or later our application is destined to meet an OutOfMemoryError.&lt;/p&gt;
&lt;h3 id=&#34;threadlocal&#34;&gt;ThreadLocal&lt;/h3&gt;
&lt;p&gt;ThreadLocal is a api that gives us the ability to store state to a particular thread, and thus allows us to achieve thread safety.&lt;/p&gt;
&lt;p&gt;When using this construct, each thread will hold an implicit reference to its copy of a &lt;em&gt;ThreadLocal&lt;/em&gt; variable and will maintain its own copy, instead of sharing the resource across multiple threads, as long as the thread is alive.&lt;/p&gt;
&lt;p&gt;Despite its advantages, the use of &lt;em&gt;ThreadLocal&lt;/em&gt; variables is controversial, as they&amp;rsquo;re infamous for introducing memory leaks if not used properly. Joshua Bloch once commented on thread local usage that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Can you cause unintended object retention with thread locals? Sure you can. But you can do this with arrays too. That doesn’t mean that thread locals (or arrays) are bad things. Merely that you have to use them with some care. The use of thread pools demands extreme care. Sloppy use of thread pools in combination with sloppy use of thread locals can cause unintended object retention, as has been noted in many places. But placing the blame on thread locals is unwarranted.” – Joshua Bloch&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;ThreadLocals&lt;/em&gt; are supposed to be garbage collected once the holding thread is no longer alive. But the problem arises when we use &lt;em&gt;ThreadLocals&lt;/em&gt; along with modern application servers.&lt;/p&gt;
&lt;p&gt;Modern application servers use a pool of threads to process requests, instead of creating new ones (for example, &lt;a href=&#34;https://tomcat.apache.org/tomcat-7.0-doc/config/executor.html&#34;&gt;the &lt;em&gt;Executor&lt;/em&gt;&lt;/a&gt; in the case of Apache Tomcat). Moreover, they also use a separate &lt;code&gt;classloader&lt;/code&gt;. Since ThreadPools in application servers work on the concept of thread reuse, they&amp;rsquo;re never garbage collected; instead, they&amp;rsquo;re reused to serve another request.&lt;/p&gt;
&lt;p&gt;If any class creates a &lt;em&gt;ThreadLocal&lt;/em&gt; variable, but doesn&amp;rsquo;t explicitly remove it, then a copy of that object will remain with the worker &lt;em&gt;Thread&lt;/em&gt; even after the web application is stopped, thus preventing the object from being garbage collected.&lt;/p&gt;
&lt;h4 id=&#34;how-does-threadlocal-creates-memory-leak&#34;&gt;How does ThreadLocal Creates memory leak&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Each &lt;code&gt;Thread&lt;/code&gt; has a private field &lt;code&gt;threadLocals&lt;/code&gt;, which actually stores the thread-local values.&lt;/li&gt;
&lt;li&gt;Each &lt;em&gt;key&lt;/em&gt; in this map is a weak reference to a &lt;code&gt;ThreadLocal&lt;/code&gt; object, so after that &lt;code&gt;ThreadLocal&lt;/code&gt; object is garbage-collected, its entry is removed from the map.&lt;/li&gt;
&lt;li&gt;But each &lt;em&gt;value&lt;/em&gt; is a strong reference, so when a value (directly or indirectly) points to the &lt;code&gt;ThreadLocal&lt;/code&gt; object that is its &lt;em&gt;key&lt;/em&gt;, that object will neither be garbage-collected nor removed from the map as long as the thread lives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this example, the chain of strong references looks like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Thread&lt;/code&gt; object → &lt;code&gt;threadLocals&lt;/code&gt; map → instance of example class → example class → static &lt;code&gt;ThreadLocal&lt;/code&gt; field → &lt;code&gt;ThreadLocal&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;Lets see an example of this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day67&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ThreadLocal&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; threadLocal = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ThreadLocal&amp;lt;&amp;gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; InterruptedException {
        List&amp;lt;Thread&amp;gt; threads = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++) {
            Thread thread = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
                List&amp;lt;String&amp;gt; list = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
                threadLocal.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(list);
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// add a lot of data to the thread-local list
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; j = 0; j &amp;lt; 100000; j++) {
                    list.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;This is a string that will consume some memory.&amp;#34;&lt;/span&gt;);
                }
            });
            threads.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(thread);
            thread.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Thread thread : threads) {
            thread.&lt;span style=&#34;color:#bbb&#34;&gt;join&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// At this point, all threads have completed execution.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// However, the thread-local lists have not been cleared,
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// and will continue to consume memory until the program terminates.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this program, we define a ThreadLocal variable called threadLocal which stores a list of strings. We then create 10 threads and in each thread, we create a new list and add a lot of data to it. We then set this list as the value of the thread-local variable using threadLocal.set(list).&lt;/p&gt;
&lt;p&gt;Because the ThreadLocal variable is thread-local, each thread has its own list and the lists are not shared between threads. However, since we are adding a lot of data to each list, they consume a significant amount of memory.&lt;/p&gt;
&lt;p&gt;The problem is that once each thread has completed execution, the lists are not cleared. Because the ThreadLocal variable still holds a reference to each list, they will not be garbage collected and will continue to consume memory until the program terminates. This can lead to a memory leak, as the program&amp;rsquo;s memory usage will continue to grow over time.&lt;/p&gt;
&lt;p&gt;To avoid this, we should always make sure to clear the thread-local variables once we are done with them, by calling &lt;code&gt;threadLocal.remove()&lt;/code&gt; at the end of each thread&amp;rsquo;s execution.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 66: Becoming a memory plumber; A tale of Memory Leak and how to find them ( part 1)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day66/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day66/</id>
    <published>2023-01-20T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding and finding the causes and types of memory leaks and tools and suggestions to fix them</summary>
    <content type="html">&lt;h3 id=&#34;what-is-memory-leak&#34;&gt;What is memory leak&lt;/h3&gt;
&lt;p&gt;Memory leaks are a major issue for software engineers, especially those working with Java. A memory leak occurs when an application continues to use more and more of the computer&amp;rsquo;s RAM without releasing it after it has been used. This can cause serious performance issues as the available RAM decreases and eventually leads to system crashes or outages.&lt;/p&gt;
&lt;p&gt;Java has automated memory management system unlike its predecessor C . Java does this using GC. The GC implicitly takes care of allocating and freeing up memory, and thus is capable of handling the majority of memory leak issues.&lt;/p&gt;
&lt;p&gt;While the GC effectively handles a good amount of memory, it doesn&amp;rsquo;t guarantee a foolproof solution to memory leaking. The GC is pretty smart, but not flawless. Memory leaks can still happen.&lt;/p&gt;
&lt;p&gt;Now let us understand what is Memory Leak&lt;/p&gt;
&lt;h3 id=&#34;memory-leak&#34;&gt;Memory Leak&lt;/h3&gt;
&lt;p&gt;a memory leak is a type of resource leak that occurs when a computer program incorrectly manages memory allocations in a way that memory which is no longer needed is not released.&lt;/p&gt;
&lt;p&gt;As a software engineer, it’s important to understand the concept of memory leaks in Java. A memory leak is when an application continues to hold onto memory that it no longer needs and this can lead to performance issues or even system crashes. In Java, a common cause of such leaks is objects not being garbage collected as expected due to references still pointing at them from other parts of the code.&lt;/p&gt;
&lt;p&gt;When an object is created in Java, the JVM (Java Virtual Machine) allocates space for it on the heap and then assigns a reference variable which points towards that allocated space. As long as there are any active references pointing towards this object, it will remain alive on heap until all these references are removed and GC (Garbage Collector) reclaims its resources back from Heap Memory Pool. If somehow some reference(s) remains active even after they have been used up by program logic then those objects become eligible for Garbage Collection but never get collected since their respective reference variables still point at them causing unnecessary accumulation of unused/unrequired Objects over time resulting into what we call “Memory Leak” issue with our Application Codebase leading into Performance Degradation &amp;amp; System Crashes eventually!&lt;/p&gt;
&lt;p&gt;To avoid such problems one should keep track if their code has any potential chances where Object References might be left dangling without getting released explicitly using null assignments or try-catch blocks etc., so that GC can reclaim those resources back once they become eligible otherwise Memory Leaks would continue accumulating over time leading us into trouble!&lt;/p&gt;
&lt;h3 id=&#34;what-problems-it-causes&#34;&gt;What problems it causes&lt;/h3&gt;
&lt;p&gt;Memory leaks in Java can be caused by a variety of factors such as incorrect garbage collection, resource leakage in APIs, unclosed streams or connections, poor coding practices etc. These issues can lead to decreased responsiveness from applications due to increased latency times; they may also result in OutOfMemoryError exceptions being thrown which causes applications to crash unexpectedly or become unstable over time due their inability handle large amounts of data efficiently anymore .&lt;/p&gt;
&lt;h3 id=&#34;types-of-memory-leaks&#34;&gt;Types of Memory Leaks&lt;/h3&gt;
&lt;p&gt;There are many ways memory leaks can occur in a java program. Some of them are&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Static fields&lt;/li&gt;
&lt;li&gt;Loitering objects&lt;/li&gt;
&lt;li&gt;In memory cache not evicted&lt;/li&gt;
&lt;li&gt;Unclosed resource&lt;/li&gt;
&lt;li&gt;custom equals and hashcode implementation&lt;/li&gt;
&lt;li&gt;Inner class that references outer classes&lt;/li&gt;
&lt;li&gt;Finalization bug&lt;/li&gt;
&lt;li&gt;Interned strings&lt;/li&gt;
&lt;li&gt;Thread local&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;now let us understand these typical memory leak issues&lt;/p&gt;
&lt;h4 id=&#34;static-fields&#34;&gt;static fields&lt;/h4&gt;
&lt;p&gt;heavy use of static variables can cause memory leaks. In Java, static fields have a lifetime that usually matches the entire lifetime of the running program / application (unless ClassLoader becomes eligible for garbage collection).&lt;/p&gt;
&lt;p&gt;lets see a case&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day65&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;String&amp;gt; strings = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;add&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 100000; i++) {
            list.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String());
        }
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;check point add&amp;#34;&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Beforee calling add&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Day65().&lt;span style=&#34;color:#bbb&#34;&gt;populateList&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;After calling add&amp;#34;&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here when observing with&lt;/p&gt;
&lt;h4 id=&#34;loitering-objects&#34;&gt;Loitering Objects&lt;/h4&gt;
&lt;p&gt;These objects are allocated memory, but not used, and not garbage collected. These keep increasing the size of the JVM heap and represent memory leaks, which can cause an out-of-memory error or excessive overhead on the garbage collector.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s understand this scenario with an example, consider a stack backed by an array, and you implement pop this way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;pop&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (top == -1) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NoSuchElementException();
    }
    T item = items[top--];
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; item;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Because the array holds a reference to the item at the former top of the stack, the item is still strongly reachable from the array and therefore won&amp;rsquo;t be garbage collected. Furthermore, because of the way a stack works, the item is no longer externally accessible. Thus, the item is said to be &amp;ldquo;loitering&amp;rdquo;. It hangs around for no reason.&lt;/p&gt;
&lt;p&gt;The correct implementation of the pop method would be this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;pop&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (top == -1) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NoSuchElementException();
    }
    T item = items[top];
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Clear the reference to allow garbage collection
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    items[top] = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    top--;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; item;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;By setting the array entry to null, the item is no longer reachable from the array. Therefore it is eligible for garbage collection.&lt;/p&gt;
&lt;p&gt;Garbage collection isn&amp;rsquo;t magic. It can do most of the work to clean up memory for you. But, you have to make sure you write your code correctly to eliminate unnecessary strong references. The garbage collector can&amp;rsquo;t read your mind, and figure out that you didn&amp;rsquo;t really mean to keep the strong reference.&lt;/p&gt;
&lt;h4 id=&#34;in-memory-cache-eviction&#34;&gt;In Memory Cache Eviction&lt;/h4&gt;
&lt;p&gt;when we build in memory cache (in this case Guava library) there is a possibility of memory leak when the cache get increased without clearing the cache. let us first understand what is cache eviction&lt;/p&gt;
&lt;h5 id=&#34;cache-eviction&#34;&gt;Cache Eviction&lt;/h5&gt;
&lt;p&gt;Caches are small because cache memory is more expensive to produce and purchase. The small size of the cache limits the amount of data we can store. We need to consider what data we keep or remove over time. This dilemma is the core purpose behind cache eviction. It will depending on algorithms will remove some entries.&lt;/p&gt;
&lt;p&gt;So by restricting the size or creating an eviction policy will ensure the cache doesn&amp;rsquo;t grow uncontrollably.&lt;/p&gt;
&lt;p&gt;In the below example we will see a cache without a size or eviction policy&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomCache&lt;/span&gt;&amp;lt;T&amp;gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Cache&amp;lt;String, T&amp;gt; cache;

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Constructor to build Cache Store
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;CustomCache&lt;/span&gt;() {
        cache = CacheBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
    }


    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;get&lt;/span&gt;(String key) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; cache.&lt;span style=&#34;color:#bbb&#34;&gt;getIfPresent&lt;/span&gt;(key);
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Method to put a new record in Cache Store with record key
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;add&lt;/span&gt;(String key, T value) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt;(key != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; value != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            cache.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(key, value);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Entry stored in &amp;#34;&lt;/span&gt;
                    + value.&lt;span style=&#34;color:#bbb&#34;&gt;getClass&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getSimpleName&lt;/span&gt;()
                    + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; Cache with Key = &amp;#34;&lt;/span&gt; + key);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now adding a size and cache eviction policy will help not to cause memory leak. In guava &lt;code&gt;CacheBuilder&lt;/code&gt; by adding the properties &lt;code&gt;maximumSize&lt;/code&gt; and &lt;code&gt;expireAfterAccess&lt;/code&gt; will limit the size and when will be the entires will be deleted&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;CustomCache&lt;/span&gt;() {
        cache = CacheBuilder.&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
        					.&lt;span style=&#34;color:#bbb&#34;&gt;maximumSize&lt;/span&gt;(100)
                            .&lt;span style=&#34;color:#bbb&#34;&gt;expireAfterAccess&lt;/span&gt;(30, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MINUTES&lt;/span&gt;)
        					.&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In part 2 will learn about other type of reasons for memory leak&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 65: A tale of RMI (Remote Method Invocation)  in java</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day65/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day65/</id>
    <published>2023-01-12T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding how RPC and RMI works in java</summary>
    <content type="html">&lt;p&gt;Remote Method Invocation (RMI) and Remote Procedure Call (RPC) are two important concepts in Java that allow for distributed computing. Both RMI and RPC enable software components to communicate with each other over a network, allowing code to be executed on different machines without the need for manual intervention. In this blog post, we will discuss what RMI and RPC are, how they differ from one another, their advantages/disadvantages as well as an example of each in Java.&lt;/p&gt;
&lt;h3 id=&#34;what-is-rmi&#34;&gt;What is RMI&lt;/h3&gt;
&lt;p&gt;At its core, Remote Method Invocation is a way of calling methods on remote objects over a network connection using the &lt;code&gt;Object Request Broker Architecture (ORB)&lt;/code&gt;. It provides developers with the ability to execute code remotely without having any knowledge about where or how it is being run – all you need is an interface definition file (.idl file), which describes your object&amp;rsquo;s methods signatures and return types along with some additional information related to security etc., then you can use it just like any other local object! The main benefit here lies in its flexibility; since there’s no requirement for manual coding or compilation when making changes across multiple systems simultaneously - instead all that needs doing is updating one centralised IDL file.&lt;/p&gt;
&lt;p&gt;Remote invocation is nothing new. For many years C programmers have used remote procedure calls (RPC) to execute a C function on a remote host and return the results. The primary difference between RPC and RMI is that RPC, being an offshoot of the C language, is primarily concerned with data structures. It’s relatively easy to pack up data and ship it around, but for Java, that’s not enough. In Java we don’t just work with data structures; we work with objects, which contain both data and methods for operating on the data. Not only do we have to be able to ship the state of an object (the data) over the wire, but also the recipient has to be able to interact with the object (use its methods) after receiving it.&lt;/p&gt;
&lt;p&gt;Now let us first understand some concepts regarding RMI and how it works. At first lets understad what are Remote and Non Remote Objects&lt;/p&gt;
&lt;h4 id=&#34;remote-and-non-remote-obj&#34;&gt;Remote and Non Remote Obj&lt;/h4&gt;
&lt;p&gt;Before an object can be used with RMI, it must be serializable. But that’s not sufficient. Remote objects in RMI are real distributed objects. As the name suggests, a remote object can be an object on a different machine; it can also be an object on the local host. The term remote means that the object is used through a special kind of object reference that can be passed over the network. Like normal Java objects, remote objects are passed by reference. Regardless of where the reference is used, the method invocation occurs at the original object, which still lives on its original host. If a remote host returns a reference to one of its objects to you. Then you call that object’s methods; the actual method invocations will happen on the remote host, where the object is.&lt;/p&gt;
&lt;p&gt;Non remote objects are simpler. They are just normal serializable objects. (You can pass these over the network). The catch is that when you pass a non remote object over the network it is simply copied. So references to the object on one host are not the same as those on the remote host. Non remote objects are passed by copy (as opposed to by reference).&lt;/p&gt;
&lt;h4 id=&#34;stub&#34;&gt;Stub&lt;/h4&gt;
&lt;p&gt;Stub is used in the implementation of remote objects. When you invoke a method on a remote object (which could be on a different host), you are actually calling some local code that serves as a proxy for that object. This is the stub. (It is called a stub because it is something like a truncated placeholder for the object.)&lt;/p&gt;
&lt;p&gt;The stub object on the client machine builds an information block and sends this information to the server.&lt;/p&gt;
&lt;p&gt;The block consists of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An identifier of the remote object to be used&lt;/li&gt;
&lt;li&gt;Method name which is to be invoked&lt;/li&gt;
&lt;li&gt;Parameters to the remote JVM&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;skeleton&#34;&gt;Skeleton&lt;/h4&gt;
&lt;p&gt;The skeleton is another proxy that lives with the real object on its original host. It receives remote method invocations from the stub and passes them to the object.&lt;/p&gt;
&lt;p&gt;The skeleton object passes the request from the stub object to the remote object. It performs the following tasks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It calls the desired method on the real object present on the server.&lt;/li&gt;
&lt;li&gt;It forwards the parameters received from the stub object to the method.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before creatin stubs and skeletons we need to create remote object and understand how it works&lt;/p&gt;
&lt;h4 id=&#34;remote-object&#34;&gt;Remote Object&lt;/h4&gt;
&lt;p&gt;The first thing to do is to create an interface that will provide the description of the methods that can be invoked by remote clients. This interface should extend the Remote interface and the method prototype within the interface should throw the RemoteException.&lt;/p&gt;
&lt;p&gt;Remote objects are objects that implement a special remote interface that specifies which of the object’s methods can be invoked remotely. The remote interface must extend the java.rmi.Remote interface. Your remote object will implement its remote interface; as will the stub object that is automatically generated for it. In the rest of your code, you should then refer to the remote object as an instance of the remote interface—not as an instance of its actual class. Because both the real object and stub implement the remote interface, they are equivalent as far as we are concerned (for method invocation); locally, we never have to worry about whether we have a reference to a stub or to an actual object. This “type equivalence” means that we can use normal language features, like casting with remote objects. Of course public fields (variables) of the remote object are not accessible through an interface, so you must make accessor methods if you want to manipulate the remote object’s fields.&lt;/p&gt;
&lt;p&gt;All methods in the remote interface must declare that they can throw the exception java.rmi.RemoteException . This exception (actually, one of many subclasses to RemoteException) is thrown when any kind of networking error happens: for example, the server could crash, the network could fail, or you could be requesting an object that for some reason isn’t available.&lt;/p&gt;
&lt;p&gt;Here’s a simple example of the remote interface that defines the behavior of RemoteObject; we’ll give it a method that can be invoked remotely&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MessageService&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; Remote {
    String &lt;span style=&#34;color:#447fcf&#34;&gt;send&lt;/span&gt;(String message) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; RemoteException;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;when we implement this object its called remote object which is for the server. For the client, the RMI library will dynamically create an implementation Stub.&lt;/p&gt;
&lt;p&gt;implementation&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MessengerServiceImpl&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; MessengerService { 
 
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt; 
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;send&lt;/span&gt;(String message) { 
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Client Message&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(message) ? &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Server Message&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It&amp;rsquo;d be unusual for our remote object to throw a RemoteException since this exception is typically reserved for the RMI library to raise communication errors to the client. Leaving it out also has the benefit of keeping our implementation RMI-agnostic. Also, any additional methods defined in the remote object, but not in the interface, remain invisible for the client.&lt;/p&gt;
&lt;p&gt;Once we create the remote implementation, we need to bind the remote object to an RMI registry.&lt;/p&gt;
&lt;h3 id=&#34;rmi-registry&#34;&gt;RMI Registry&lt;/h3&gt;
&lt;p&gt;The registry is the RMI phone book. You use the registry to look up a reference to a registered remote object on another host. We’ve already described how remote references can be passed back and forth by remote method calls. But the registry is needed to bootstrap the process: the client needs some way of looking up some initial object.&lt;/p&gt;
&lt;p&gt;The registry is implemented by a class called &lt;code&gt;Naming&lt;/code&gt; and an application called rmiregistry . This application must be running on the local host before you start a Java program that uses the registry. You can then create instances of remote objects and bind them to particular names in the registry. (Remote objects that bind themselves to the registry sometimes provide a main( ) method for this purpose.) A registry name can be anything you choose; it takes the form of a slash-separated path. When a client object wants to find your object, it constructs a special URL with the rmi: protocol, the hostname, and the object name. On the client, the RMI Naming class then talks to the registry and returns the remote object reference.&lt;/p&gt;
&lt;p&gt;So before registering in RMI registry we need to create a stub&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;MessengerService server = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; MessengerServiceImpl();
MessengerService stub = (MessengerService) UnicastRemoteObject
  .&lt;span style=&#34;color:#bbb&#34;&gt;exportObject&lt;/span&gt;((MessengerService) server, 0);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We use the static &lt;code&gt;UnicastRemoteObject.exportObject&lt;/code&gt; method to create our stub implementation. The stub communicates with the server over the underlying RMI protocol.&lt;/p&gt;
&lt;p&gt;The first argument to exportObject is the remote server object. The second argument is the port that exportObject uses for exporting the remote object to the registry.&lt;/p&gt;
&lt;p&gt;Giving a value of zero indicates that we don&amp;rsquo;t care which port exportObject uses, which is typical and so chosen dynamically.&lt;/p&gt;
&lt;h4 id=&#34;unicastremoteobject&#34;&gt;UnicastRemoteObject&lt;/h4&gt;
&lt;p&gt;The actual implementation of a remote object (not the interface we discussed previously) will usually extend &lt;code&gt;java.rmi.server.UnicastRemoteObject&lt;/code&gt;. This is the RMI equivalent to the familiar Object class. When a subclass of UnicastRemoteObject is constructed, the RMI runtime system automatically “exports” it to start listening for network connections from remote interfaces (stubs) for the object. Like &lt;code&gt;java.lang.Object&lt;/code&gt;, this superclass also provides implementations of &lt;code&gt;equals( )&lt;/code&gt; , &lt;code&gt;hashcode( )&lt;/code&gt;, and &lt;code&gt;toString( )&lt;/code&gt; that make sense for a remote object.&lt;/p&gt;
&lt;h3 id=&#34;rmi-architecture&#34;&gt;RMI Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1673840235/images-from-blog/30_Java_Remote_Method_Invocation_RMI_architecture_sr9ydb.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Now lets create a RMI registry&lt;/p&gt;
&lt;h3 id=&#34;creating-rmi-registry&#34;&gt;Creating RMI Registry&lt;/h3&gt;
&lt;p&gt;We can start up a registry local to our server or as a separate stand-alone service. Here we will create for local&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Registry rmiRegistry = LocateRegistry.&lt;span style=&#34;color:#bbb&#34;&gt;createRegistry&lt;/span&gt;(1099);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This creates a registry to which stubs can be bound by servers and discovered by clients. Also, we&amp;rsquo;ve used the &lt;code&gt;createRegistry&lt;/code&gt; method, since we are creating the registry &lt;code&gt;local&lt;/code&gt; to the &lt;code&gt;server&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By default, an RMI registry runs on port &lt;code&gt;1099&lt;/code&gt;. Rather, a different port can also be specified in the createRegistry factory method.&lt;/p&gt;
&lt;p&gt;But in the stand-alone case, we&amp;rsquo;d call &lt;code&gt;getRegistry&lt;/code&gt;, passing the &lt;code&gt;hostname&lt;/code&gt; and &lt;code&gt;port&lt;/code&gt; number as parameters.&lt;/p&gt;
&lt;p&gt;Now we have to bind the stub which is generated by rmic to registry&lt;/p&gt;
&lt;h4 id=&#34;bind-stub&#34;&gt;Bind Stub&lt;/h4&gt;
&lt;p&gt;An RMI registry is a naming facility like JNDI etc. We can follow a similar pattern here, binding our stub to a unique key: here its &lt;code&gt;MessageService&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;registry.&lt;span style=&#34;color:#bbb&#34;&gt;rebind&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MessengerService&amp;#34;&lt;/span&gt;, stub);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;after registering the stub in RMI registry we need to create a client.&lt;/p&gt;
&lt;h4 id=&#34;create-client&#34;&gt;Create Client&lt;/h4&gt;
&lt;p&gt;To do this, we&amp;rsquo;ll first locate the RMI registry. In addition, we&amp;rsquo;ll look up the remote object stub using the bounded unique key.&lt;/p&gt;
&lt;p&gt;And finally, we&amp;rsquo;ll invoke the send method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Registry registry = LocateRegistry.&lt;span style=&#34;color:#bbb&#34;&gt;getRegistry&lt;/span&gt;();
MessengerService server = (MessengerService) registry
  .&lt;span style=&#34;color:#bbb&#34;&gt;lookup&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MessengerService&amp;#34;&lt;/span&gt;); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// looking for the binded stub
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;String responseMessage = server.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Client Message&amp;#34;&lt;/span&gt;);
String expectedMessage = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Server Message&amp;#34;&lt;/span&gt;;
 
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (expectedMessage.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(responseMessage)) {
	System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Connection Successful&amp;#34;&lt;/span&gt;);
} &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
	System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Not able to recognize client&amp;#34;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Because we&amp;rsquo;re running the RMI registry on the local machine and default port 1099, we don&amp;rsquo;t pass any parameters to getRegistry. Indeed, if the registry is rather on a different host or different port, we can supply these parameters. Once we lookup the stub object using the registry, we can invoke the methods on the remote server.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 64: Implementing a basic Bloom Filter Using Java BitSet api</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day64/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day64/</id>
    <published>2022-12-28T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a basic bloom filter to understand its concepts and usages using Java BitSet api</summary>
    <content type="html">&lt;p&gt;First of all lets understand what is a Bloom Filter and how does it work and what are its usages.&lt;/p&gt;
&lt;h3 id=&#34;bloom-filter-&#34;&gt;Bloom Filter :&lt;/h3&gt;
&lt;p&gt;Bloom filter is a data structure designed to tell you, rapidly and memory-efficiently, whether an element is present in a set.&lt;/p&gt;
&lt;p&gt;The price paid for this efficiency is that a Bloom filter is a &lt;strong&gt;probabilistic data structure&lt;/strong&gt;: it tells us that the element either &lt;em&gt;definitely is not&lt;/em&gt; in the set or &lt;em&gt;may be&lt;/em&gt; in the set&lt;/p&gt;
&lt;p&gt;For example, checking availability of username. In this case its a set membership problem, where the set is the list of all registered username. The price we pay for efficiency is that it is probabilistic in nature. That means, there might be some False Positive results. &lt;strong&gt;False positive means&lt;/strong&gt;, it might tell that given username is already taken but actually it’s not.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://miro.medium.com/max/1400/1*hCwivv91BuskNzZ1ebq6jw.png&#34; alt=&#34;Bloom Filters: Visuals for explanation and applied systems | by Brian  Femiano | Level Up Coding&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;here in this scenario we are searching for the user name &lt;code&gt;Mary&lt;/code&gt; in the bloom filter. So from the picture we can see a bloom filter is a combination of a hash function and a bit array or list. Where after hashing the user name will give us a number in which we will set the bit to true.&lt;/p&gt;
&lt;p&gt;So if we use different hash functions and then  update the bit array with 1 where the index of the array would be number provided by the hash function. Then if we search the name again with those hash functions and check the index&amp;rsquo;s again and if we find 1 there then we can plausibly say that, that name exist in the bloom filter.&lt;/p&gt;
&lt;h3 id=&#34;so-in-a-nutshell&#34;&gt;So, in a nutshell:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If we search for a value and see any of the hashed indexes for this value is ‘0’ then, the value is definitely not on the list.&lt;/li&gt;
&lt;li&gt;If all of the hashed indexes is ‘1’ then ‘maybe’ the searched value is on the list.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;properties-&#34;&gt;Properties :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;unlike a standard hash table, a Bloom filter of a fixed size can represent a set with large number of elements.&lt;/li&gt;
&lt;li&gt;False positive rate increases steadily as elements are added until all bits in the filter are set to 1, at which point all queries yield a positive result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So let us discuss what is false positive in the case of getting information from a bloom filter.&lt;/p&gt;
&lt;p&gt;The question is why we said &lt;strong&gt;“Probabilistic”&lt;/strong&gt;, why this uncertainty? Let’s understand this with an example. Suppose we want to check whether “Mohibul” is present or not. We’ll calculate hashes using h1, h2 and h3 functions&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;String name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Mohibul&amp;#34;&lt;/span&gt;;
h1(name) % 10 = 5;
h2(name) % 10 = 2;
h3(name) % 10 = 4;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If we check the bit array, bits at these indices are set to 1.&lt;/p&gt;
&lt;p&gt;Now lets check for another name &amp;ldquo;Mary&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;String name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Mary&amp;#34;&lt;/span&gt;
h1(name) % 10 = 1;
h2(name) % 10 = 2;
h3(name) % 10 = 5;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;but we know that &lt;strong&gt;“Mary”&lt;/strong&gt; was never added to the filter. Bit at index &lt;code&gt;2&lt;/code&gt; and &lt;code&gt;5&lt;/code&gt; was set when we added &lt;strong&gt;“Mohibul”&lt;/strong&gt; . And if another name made 1 bit true then this bloom filter will say that &amp;ldquo;Mary&amp;rdquo; exists in the filter but in real we didnt add Mary.&lt;/p&gt;
&lt;p&gt;This behavior causes false positives.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloom filters never generate &lt;strong&gt;false negative&lt;/strong&gt; result, i.e., telling you that a username doesn’t exist when it actually exists.&lt;/li&gt;
&lt;li&gt;Deleting elements from filter is not possible. Because, if we delete a single element by clearing bits at indices generated by k hash functions, it might cause deletion of few other elements. Example – if we delete “Mohibul” (in given example) by clearing bit at 4, 5 and 2, we might end up deleting “Mary” also if its present Because bit at index 2 and 5 becomes 0 and bloom filter claims that “ Mary ” is not present.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us make a bloom filter ourselves.&lt;/p&gt;
&lt;p&gt;Before doing that let us ask some question that will help us better design and understand&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What are these hash functions?&lt;/li&gt;
&lt;li&gt;How big should I make the bloom filters?&lt;/li&gt;
&lt;li&gt;How many hash functions should i use?&lt;/li&gt;
&lt;li&gt;Benefits of bloom filter?&lt;/li&gt;
&lt;li&gt;Where can I use them?&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;what-is-hash-functions&#34;&gt;What is Hash functions&lt;/h4&gt;
&lt;p&gt;The hash functions used in a Bloom filter should be independent and uniformly distributed. They should also be as fast as possible (cryptographic hashes such as &lt;code&gt;sha1&lt;/code&gt;, though widely used thus are not very good choices).&lt;/p&gt;
&lt;p&gt;Examples of fast, simple hashes that are independent enough includes &lt;a href=&#34;https://sites.google.com/site/murmurhash/&#34; title=&#34;murmur hash&#34;&gt;murmur&lt;/a&gt;, &lt;a href=&#34;https://github.com/Cyan4973/xxHash&#34; title=&#34;xxHash&#34;&gt;xxHash&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function&#34; title=&#34;Fowler-Noll-Vo hash &#34;&gt;Fowler–Noll–Vo hash function&lt;/a&gt;  and many others&lt;/p&gt;
&lt;h4 id=&#34;how-big-should-i-make-the-bloom-filters&#34;&gt;How big should I make the bloom filters&lt;/h4&gt;
&lt;p&gt;It&amp;rsquo;s a nice property of Bloom filters that you can modify the false positive rate of your filter. A larger filter will have less false positives, and a smaller one more.&lt;/p&gt;
&lt;p&gt;Your false positive rate (P) will be approximately&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-math&#34; data-lang=&#34;math&#34;&gt;(1-e^((-kn)/m)))^k
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;so you can just plug the number n of elements you expect to insert, and try various values of k and m to configure your filter for your application.&lt;/p&gt;
&lt;p&gt;Here&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;m - is the size of the bit array
n - is the number of elements
k - is the number hash funtions
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This leads to an obvious question&lt;/p&gt;
&lt;h4 id=&#34;how-many-hash-functions-should-i-use&#34;&gt;How many hash functions should I use?&lt;/h4&gt;
&lt;p&gt;The more hash functions you have, the slower your bloom filter, and the quicker it fills up. If you have too few, however, you may suffer too many false positives.&lt;/p&gt;
&lt;p&gt;Since you have to pick k when you create the filter, you&amp;rsquo;ll have to ballpark what range you expect n to be in. Once you have that, you still have to choose a potential m (the number of bits) and k (the number of hash functions).&lt;/p&gt;
&lt;p&gt;So now we can design a process to build a bloom filter&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose a approx value for n&lt;/li&gt;
&lt;li&gt;Choose a value for m&lt;/li&gt;
&lt;li&gt;Calculate the optimal value of k&lt;/li&gt;
&lt;li&gt;Calculate the error rate for our chosen values of n, m, and k. If it&amp;rsquo;s unacceptable, return to step 2 and change m; otherwise we&amp;rsquo;re done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now for the code we will use Java&amp;rsquo;s BitSet API&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BloomFilter&lt;/span&gt;&amp;lt;T&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; BitSet bitSet;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; n;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; m;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; List&amp;lt;Function&amp;lt;T, Integer&amp;gt;&amp;gt; hashFunctions;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;BloomFilter&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; n, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; m,
                           &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;Function&amp;lt;T, Integer&amp;gt;&amp;gt; hashFunctions) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;n&lt;/span&gt; = n;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;bitSet&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BitSet(n);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;m&lt;/span&gt; = hashFunctions.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;hashFunctions&lt;/span&gt; = hashFunctions;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;add&lt;/span&gt;(T value) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Function&amp;lt;T, Integer&amp;gt; function : hashFunctions) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = mapHashToInt(function.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(value));
                bitSet.&lt;span style=&#34;color:#bbb&#34;&gt;set&lt;/span&gt;(hash, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
            }
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;mightContain&lt;/span&gt;(T value) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Function&amp;lt;T, Integer&amp;gt; function : hashFunctions) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash = mapHashToInt(function.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(value));
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!bitSet.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(hash)) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
                }
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;mapHashToInt&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; hash) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; hash &amp;amp; (n - 1);
        }

    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here &lt;code&gt;Function&amp;lt;T,Integer&amp;gt; hashFunctions&lt;/code&gt; supplied by the client. And BitSet exactly works like a bit array.&lt;/p&gt;
&lt;p&gt;Now we have tried our custom BloomFilter Google guava has a implementation of BloomFilter which can be created like&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;BloomFilter&amp;lt;Integer&amp;gt; filter = BloomFilter.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(
  Funnels.&lt;span style=&#34;color:#bbb&#34;&gt;integerFunnel&lt;/span&gt;(),
  500,
  0.&lt;span style=&#34;color:#bbb&#34;&gt;01&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;benifits-of-bloom-filter&#34;&gt;Benifits of Bloom Filter&lt;/h4&gt;
&lt;p&gt;Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k). That is, each time you want to add an element to the set or check set membership, you just need to run the element through the k hash functions and add it to the set or check those bits.&lt;/p&gt;
&lt;p&gt;The space advantages are more difficult to sum up; again it depends on the error rate you&amp;rsquo;re willing to tolerate. It also depends on the potential range of the elements to be inserted; if it is very limited, a deterministic bit vector can do better. If you can&amp;rsquo;t even ballpark estimate the number of elements to be inserted, you may be better off with a hash table or a scalable Bloom filter.&lt;/p&gt;
&lt;h4 id=&#34;where-can-i-use-it&#34;&gt;Where Can I Use It&lt;/h4&gt;
&lt;p&gt;Bloom filter is all about testing Membership in a set. The classic example of using bloom filters is to reduce expensive disk (or network) lookups for non-existent keys. As we can see that bloom filters can search for a key in O(k) constant time, where k is the number of hash functions, it will be very fast to test non-existence of a key.&lt;/p&gt;
&lt;p&gt;If the element is not in the bloom filter, then we know for sure we don’t need to perform the expensive lookup. On the other hand, if it is in the bloom filter, we perform the lookup, and we can expect it to fail some proportion of the time (the false positive rate).&lt;/p&gt;
&lt;p&gt;For some more concrete examples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You’ve seen in our given example that we could’ve use it to warn the user for weak passwords.&lt;/li&gt;
&lt;li&gt;You can use bloom filter to prevent your users from accessing malicious sites.&lt;/li&gt;
&lt;li&gt;Instead of making a query to an SQL database to check if a user with a certain email exists, you could first use a bloom filter for an inexpensive lookup check. If the email doesn’t exist, great! If it does exist, you might have to make an extra query to the database. You can do the same to search for if a ‘Username is already taken’.&lt;/li&gt;
&lt;li&gt;You can keep a bloom filter based on the IP address of the visitors to your website to check if a user to your website is a ‘returning user’ or a ‘new user’. Some false positive value for ‘returning user’ won’t hurt you, right?&lt;/li&gt;
&lt;li&gt;You can also make a Spell-checker by using bloom filter to track the dictionary words.&lt;/li&gt;
&lt;li&gt;Want to know how Medium used bloom filter to decide if a user already read post? Read this mind-blowing, freaking awesome article about it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;in this wikipidia &lt;a href=&#34;&#34;&gt;link&lt;/a&gt; there are multiple other usage of bloom filter.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 63: Alert system for Java OutOfMemory Error </title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day63/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day63/</id>
    <published>2022-12-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using JMX to write an alert system for Java JVM OutOfMemory Error</summary>
    <content type="html">&lt;h3 id=&#34;what-is-outofmemory&#34;&gt;What is OutOfMemory&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;java.lang.OutOfMemoryError&lt;/code&gt; exception  is thrown when there is insufficient space to allocate an object in the Java heap. In this case, The garbage collector cannot make space available to accommodate a new object, and the heap cannot be expanded further. Also, this error may be thrown when there is insufficient native memory to support the loading of a Java class. In a rare instance, a &lt;code&gt;java.lang.OutOfMemoryError&lt;/code&gt; may be thrown when an excessive amount of time is being spent doing garbage collection and little memory is being freed.&lt;/p&gt;
&lt;p&gt;When a &lt;code&gt;java.lang.OutOfMemoryError&lt;/code&gt; exception is thrown, a stack trace is also printed. In that stack trace the cause are mentioned for easier fixing of the issue.&lt;/p&gt;
&lt;p&gt;This exception will be thrown when&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Leak occurs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Not enough heap&lt;/code&gt; space to allocate objects&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;GC&lt;/code&gt; is running all the time&lt;/li&gt;
&lt;li&gt;Trying to allocate memory larger than the heap size&lt;/li&gt;
&lt;li&gt;When Metaspace memory is full&lt;/li&gt;
&lt;li&gt;When native memory is not enough to allocate&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-oom-happens&#34;&gt;How OOM happens&lt;/h3&gt;
&lt;p&gt;There are many more reasons OOM can occur. An OutOfMemoryError (OOME) is bad. It can happen at any time, with any thread. There is little that you can do about it, except to exit the program, change the -Xmx value, and restart the JVM. If you then make the -Xmx value too large, you slow down your application. The secret is to make the maximum heap value &lt;em&gt;the right size&lt;/em&gt;, neither too small, nor too big. OOME can happen with any thread, and when it does, that thread typically stops. Often, there is not enough memory to build up a stack trace for the OOME, so you cannot even determine where it occurred, or why.&lt;/p&gt;
&lt;p&gt;Now lets dive into the alert system code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Listener&lt;/span&gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;alertMemoryLow&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; used, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; max, Map&amp;lt;Thread, StackTraceElement[]&amp;gt; allThreadStackTrace);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Let us define a &lt;code&gt;Listener&lt;/code&gt; which will listen for the alert. Then&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;OOMAlertService&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;Listener&amp;gt; listeners = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;OOMAlertService&lt;/span&gt;() {
            MemoryMXBean mbean = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getMemoryMXBean&lt;/span&gt;();
            NotificationEmitter emitter = (NotificationEmitter) mbean;
            emitter.&lt;span style=&#34;color:#bbb&#34;&gt;addNotificationListener&lt;/span&gt;((notification, o) -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (notification.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(
                        MemoryNotificationInfo.&lt;span style=&#34;color:#bbb&#34;&gt;MEMORY_THRESHOLD_EXCEEDED&lt;/span&gt;)) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; maxMemory = tenuredGenPool.&lt;span style=&#34;color:#bbb&#34;&gt;getUsage&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getMax&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; usedMemory = tenuredGenPool.&lt;span style=&#34;color:#bbb&#34;&gt;getUsage&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getUsed&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (Listener listener : listeners) {
                        listener.&lt;span style=&#34;color:#bbb&#34;&gt;alertMemoryLow&lt;/span&gt;(usedMemory, maxMemory, Thread.&lt;span style=&#34;color:#bbb&#34;&gt;getAllStackTrace&lt;/span&gt;());
                    }
                }
            }, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;addListener&lt;/span&gt;(Listener listener) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; listeners.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(listener);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;removeListener&lt;/span&gt;(Listener listener) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; listeners.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(listener);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; MemoryPoolMXBean tenuredGenPool = findTenuredGenPool();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setUsageThreshold&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; threshold) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (threshold &amp;lt;= 0.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt; || threshold &amp;gt; 1.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; IllegalArgumentException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Threshold Percentage outside range&amp;#34;&lt;/span&gt;);
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; maxMemory = tenuredGenPool.&lt;span style=&#34;color:#bbb&#34;&gt;getUsage&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getMax&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; warningThreshold = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;) (maxMemory * threshold);
            tenuredGenPool.&lt;span style=&#34;color:#bbb&#34;&gt;setUsageThreshold&lt;/span&gt;(warningThreshold);
        }


        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; MemoryPoolMXBean &lt;span style=&#34;color:#447fcf&#34;&gt;findTenuredGenPool&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (MemoryPoolMXBean pool : ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getMemoryPoolMXBeans&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (pool.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Old&amp;#34;&lt;/span&gt;)
                        &amp;amp;&amp;amp; pool.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;() == MemoryType.&lt;span style=&#34;color:#bbb&#34;&gt;HEAP&lt;/span&gt;
                        &amp;amp;&amp;amp; pool.&lt;span style=&#34;color:#bbb&#34;&gt;isUsageThresholdSupported&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; pool;
                }
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Exception(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Could not find tenured space&amp;#34;&lt;/span&gt;);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In our OOMAlterService we add listeners to implement the OOMAlertService.Listener interface, with one method alertMemoryLow(&lt;strong&gt;long&lt;/strong&gt; used, &lt;strong&gt;long&lt;/strong&gt; max) that will be called when the threshold is reached.&lt;/p&gt;
&lt;p&gt;Once we have downcast the &lt;code&gt;MemoryMXBean&lt;/code&gt; to a &lt;code&gt;NotificationEmitter&lt;/code&gt; we can add a &lt;code&gt;NotificationListener&lt;/code&gt; to the &lt;code&gt;MemoryMXBean&lt;/code&gt;. You should verify that the notification is of type &lt;code&gt;MEMORY_THRESHOLD_EXCEEDED&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This notification will be emitted fast.Something to note is that the listener is being called by a special thread, called the &lt;code&gt;Low Memory Detector thread&lt;/code&gt;, that is part of the standard JVM.&lt;/p&gt;
&lt;p&gt;What is the threshold? And which of the many pools should we monitor? The only sensible pool to monitor is the Tenured Generation (Old Space). When you set the size of the memory with &lt;code&gt;-Xmx256m&lt;/code&gt;, you are setting the maximum memory to be used in the Tenured Generation. Searching in &lt;code&gt;findTenuredGenPool()&lt;/code&gt; method, and returning the first one that was of type HEAP to get the Tenured gen memory.&lt;/p&gt;
&lt;p&gt;In  &lt;code&gt;setUsageThreshold(&lt;/code&gt;&lt;strong&gt;&lt;code&gt;double&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;threshold)&lt;/code&gt; method, I specify when I would like to be notified. This threshold is a global setting. so only one usage threshold per Java Virtual Machine. The threshold value is used to calculate the usage threshold, based on the maximum memory size of the Tenured Generation pool &lt;code&gt;(not the Runtime.getRuntime().maxMemory() value!)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;findTenuredGenPool()&lt;/code&gt; I am trying to find the &lt;code&gt;Tenured / Old gen&lt;/code&gt; memory which is a heap memory. At first lets understand about JVM Heap and Non Heap memory.&lt;/p&gt;
&lt;h4 id=&#34;heap-memory&#34;&gt;Heap memory&lt;/h4&gt;
&lt;p&gt;The heap memory is the runtime data area from which the Java VM allocates memory for all class instances and arrays. The heap may be of a fixed or variable size. The garbage collector is an automatic memory management system that reclaims heap memory for objects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Eden Space: The pool from which memory is initially allocated for most objects.&lt;/li&gt;
&lt;li&gt;Survivor Space: The pool containing objects that have survived the garbage collection of the Eden space.&lt;/li&gt;
&lt;li&gt;Tenured Generation or Old Gen: The pool containing objects that have existed for some time in the survivor space.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;non-heap-memory&#34;&gt;Non-heap memory&lt;/h4&gt;
&lt;p&gt;Non-heap memory includes a method area shared among all threads and memory required for the internal processing or optimization for the Java VM. It stores per-class structures such as a runtime constant pool, field and method data, and the code for methods and constructors. The method area is logically part of the heap but, depending on the implementation, a Java VM may not garbage collect or compact it. Like the heap memory, the method area may be of a fixed or variable size. The memory for the method area does not need to be contiguous.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Permanent Generation: The pool containing all the reflective data of the virtual machine itself, such as class and method objects. With Java VMs that use class data sharing, this generation is divided into read-only and read-write areas.&lt;/li&gt;
&lt;li&gt;Code Cache: The HotSpot Java VM also includes a code cache, containing memory that is used for compilation and storage of native code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.jvmhost.com/articles/how-can-i-monitor-memory-usage-of-my-tomcat-jvm/jvm_memory_diagram1.png&#34; alt=&#34;How can I monitor memory usage of my Tomcat/JVM?&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;And for the application, the below diagram will give you an idea about how memory is distributed.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://brucehenry.github.io/blog/public/2018/02/07/JVM-Memory-Structure/JVM-Memory.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;so now lets go back to the method &lt;code&gt;findTenuredGenPool()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; MemoryPoolMXBean &lt;span style=&#34;color:#447fcf&#34;&gt;findTenuredGenPool&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (MemoryPoolMXBean pool : ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getMemoryPoolMXBeans&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (pool.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Old&amp;#34;&lt;/span&gt;)
                        &amp;amp;&amp;amp; pool.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;() == MemoryType.&lt;span style=&#34;color:#bbb&#34;&gt;HEAP&lt;/span&gt;
                        &amp;amp;&amp;amp; pool.&lt;span style=&#34;color:#bbb&#34;&gt;isUsageThresholdSupported&lt;/span&gt;()) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; pool;
                }
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Exception(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Could not find tenured space&amp;#34;&lt;/span&gt;);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this method we are looking for a pool which is of type HEAP and also in its name contains the word old. This is one way we can find the Tenured gen pool.&lt;/p&gt;
&lt;p&gt;So using this pools size and its threshold we can make alert service that will give us alert when memory is low. That way we can take necessary steps to prevent OOM error.&lt;/p&gt;
&lt;p&gt;So now running this service&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day63&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        OOMAlertService.&lt;span style=&#34;color:#bbb&#34;&gt;setUsageThreshold&lt;/span&gt;(60.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;/100.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;);

        OOMAlertService mws = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; OOMAlertService();
        mws.&lt;span style=&#34;color:#bbb&#34;&gt;addListener&lt;/span&gt;((usedMemory, maxMemory, stacktrace) -&amp;gt; {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Memory usage low!!!&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; percentageUsed = ((&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt;) usedMemory) / maxMemory;
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;percentageUsed = &amp;#34;&lt;/span&gt; + percentageUsed);
            OOMAlertService.&lt;span style=&#34;color:#bbb&#34;&gt;setUsageThreshold&lt;/span&gt;(80.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;/100.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt;);
            stacktrace.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;((key, value) -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(key + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; + Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(value)));
        });

        List&amp;lt;List&amp;lt;Object&amp;gt;&amp;gt; numbers = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
            numbers.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;());
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here I am just creating a list of object infinitely to induce OOM.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 62: Understanding JMX and its architecture ( Agent Level )</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day62/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day62/</id>
    <published>2022-11-29T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding JMX and its architecture</summary>
    <content type="html">&lt;p&gt;In part one we disscussed about JMX and its remote management layer. In this one we are going to understand its second layer which is Agent layer.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/JMX_Architecture.svg/400px-JMX_Architecture.svg.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h3 id=&#34;agent-overview&#34;&gt;Agent Overview&lt;/h3&gt;
&lt;p&gt;A JMX agent is a standard management agent that directly controls resources. And it makes them available to remote management applications. A JMX agent is usually located on the same system as the resources that it controls, but this is not a need.&lt;/p&gt;
&lt;p&gt;A JMX agent is a management entity that runs in a JVM and acts as the liaison between the managed beans (MBeans) and the management application. The various components of a JMX agent are outlined in the following sections:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MBean Server&lt;/li&gt;
&lt;li&gt;Agent Services&lt;/li&gt;
&lt;li&gt;Protocol Adaptors and Connectors&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;mbean-server&#34;&gt;MBean Server:&lt;/h3&gt;
&lt;p&gt;The MBean server AKA MBean Agent is the core component of a JMX agent. It’s a registry for objects in a JMX agent which does management operations. An object that registers with the MBean server is visible to management applications. The MBean server exposes only the management interface of an MBean.&lt;/p&gt;
&lt;p&gt;Any resource that you want to manage from outside the agent’s JVM must be registered as an MBean with the server. The MBean server provides a standardized interface for accessing MBeans within the same JVM. Thus giving local objects all the benefits of manipulating manageable resources. MBeans can be instantiated and registered by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Another MBean&lt;/li&gt;
&lt;li&gt;The agent itself&lt;/li&gt;
&lt;li&gt;A remote management application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you register an MBean, you must assign it a unique object name. A management application uses the object name to identify the object on which it is to perform a management operation. The operations available on MBeans include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discovering the management interface of MBeans&lt;/li&gt;
&lt;li&gt;Reading and writing their attribute values&lt;/li&gt;
&lt;li&gt;Performing operations defined by the MBeans&lt;/li&gt;
&lt;li&gt;Getting notifications emitted by MBeans&lt;/li&gt;
&lt;li&gt;Querying MBeans by using their object name or their attribute values&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;What is MBean&lt;/li&gt;
&lt;li&gt;MBean Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mbean&#34;&gt;MBean&lt;/h3&gt;
&lt;p&gt;MBeans are managed beans, Java objects that represent resources to be managed. MBeans can be standard or dynamic. Standard MBeans are Java objects that conform to design patterns derived from the JavaBeans component model. Dynamic MBeans define their management interface at runtime.&lt;/p&gt;
&lt;p&gt;There are two types of &lt;code&gt;MBeans&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Standard MBean&lt;/li&gt;
&lt;li&gt;Dynamic MBean&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A standard MBean exposes the resource to be managed directly through its attributes and operations. Attributes are exposed through &amp;ldquo;getter&amp;rdquo; and &amp;ldquo;setter&amp;rdquo; methods. Operations are the other methods of the class that are available to managers. All these methods are defined statically in the MBean interface and are visible to a JMX agent through introspection. This is the most straightforward way of making a new resource manageable.&lt;/p&gt;
&lt;p&gt;A dynamic MBean is an MBean that defines its management interface at runtime. For example, a configuration MBean could determine the names and types of the attributes it exposes by parsing an XML file.&lt;/p&gt;
&lt;p&gt;A JMX agent is a management entity that runs in a JVM and acts as the liaison between the managed beans (MBeans) and the management application. The various components of a JMX agent are outlined in the following sections:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MBean Server&lt;/li&gt;
&lt;li&gt;Agent Services&lt;/li&gt;
&lt;li&gt;Protocol Adaptors and Connectors&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;mbean-server-1&#34;&gt;MBean Server&lt;/h3&gt;
&lt;p&gt;The MBean server is the core component of a JMX agent. It’s a registry for objects in a JMX agent that are exposed to management operations. An object that is registered with the MBean server is visible to management applications. The MBean server exposes only the management interface of an MBean, never its direct object reference.&lt;/p&gt;
&lt;p&gt;Any resource that you want to manage from outside the agent’s JVM must be registered as an MBean with the server. The MBean server provides a standardized interface for accessing MBeans within the same JVM, giving local objects all the benefits of manipulating manageable resources. MBeans can be instantiated and registered by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Another MBean&lt;/li&gt;
&lt;li&gt;The agent itself&lt;/li&gt;
&lt;li&gt;A remote management application&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you register an MBean, &lt;code&gt;you must assign it a unique object name&lt;/code&gt;. A management application uses the object name to identify the object on which it is to perform a management operation. The operations available on MBeans include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Discovering the management interface of MBeans&lt;/li&gt;
&lt;li&gt;Reading and writing their attribute values&lt;/li&gt;
&lt;li&gt;Performing operations defined by the MBeans&lt;/li&gt;
&lt;li&gt;Getting notifications emitted by MBeans&lt;/li&gt;
&lt;li&gt;Querying MBeans by using their object name or their attribute values&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;agent-services&#34;&gt;Agent Services&lt;/h3&gt;
&lt;p&gt;Agent services are objects that can perform management operations on the MBeans that registers with the MBean server. Agent services can be provided by MBeans as well, allowing them and their functionality to be controlled through the MBean server. Java Management Extensions (JMX) Specification, version 1.4 defines the following agent services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Class loader&lt;/strong&gt; : Dynamic class loading through the management service fetches and instantiates new classes and native libraries. That are dynamically downloaded from the network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitors&lt;/strong&gt; : Monitors the numerical or string value of MBean attributes. They can notify other objects of several types of changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Timers: Timers provide a scheduling mechanism and can send notifications at predetermined intervals.&lt;/p&gt;
&lt;p&gt;Relation service: The relation service lets the MBeans communicate with each other.&lt;/p&gt;
&lt;h3 id=&#34;protocol-adaptors-and-connectors&#34;&gt;Protocol Adaptors and Connectors&lt;/h3&gt;
&lt;p&gt;Protocol adaptors and connectors make agents accessible from remote management applications. They provide a view through a specific protocol of the MBeans that are instantiated and registered with the MBean server. They enable a management application outside the JVM to:&lt;/p&gt;
&lt;p&gt;Get or set attributes of existing MBeans
Perform operations on existing MBeans
Instantiate and register new MBeans
Register for and receive notifications emitted by MBeans&lt;/p&gt;
&lt;p&gt;Platform MBeans
A platform MBean (also called an MXBean) is an MBean for monitoring and managing the Java Virtual Machine (JVM).  Each MXBean encapsulates a part of JVM functionality such as the JVM&amp;rsquo;s class loading system, JIT compilation system, garbage collector, and so on.  The java.lang.management package defines the platform MXBeans.&lt;/p&gt;
&lt;p&gt;Table 1 lists all the platform MBeans and the aspect of the VM that they manage. Each platform MXBean has a unique javax.management.ObjectName for registration in the platform MBeanServer.  A JVM may have zero, one, or more than one instance of each MXBean, depending on its function, as shown in the table.&lt;/p&gt;
&lt;h3 id=&#34;platform-mbeans&#34;&gt;Platform MBeans&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Manages&lt;/th&gt;
&lt;th&gt;Object Name&lt;/th&gt;
&lt;th&gt;Instances Per VM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ClassLoadingMXBean&lt;/td&gt;
&lt;td&gt;Class loading system&lt;/td&gt;
&lt;td&gt;java.lang:type=ClassLoading&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CompilationMXBean&lt;/td&gt;
&lt;td&gt;Compilation system&lt;/td&gt;
&lt;td&gt;java.lang:type=Compilation&lt;/td&gt;
&lt;td&gt;Zero or one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GarbageCollectorMXBean&lt;/td&gt;
&lt;td&gt;Garbage collector&lt;/td&gt;
&lt;td&gt;java.lang:type=GarbageCollector name=collectorName&lt;/td&gt;
&lt;td&gt;One or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemoryManagerMXBean (sub-interface of GarbageCollectorMXBean)&lt;/td&gt;
&lt;td&gt;Memory pool&lt;/td&gt;
&lt;td&gt;java.lang:type=MemoryManager name=managerName&lt;/td&gt;
&lt;td&gt;One or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemoryPoolMXBean&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;java.lang:type=MemoryPool name=poolName&lt;/td&gt;
&lt;td&gt;One or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemoryMXBean&lt;/td&gt;
&lt;td&gt;Memory system&lt;/td&gt;
&lt;td&gt;java.lang:type=Memory&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OperatingSystemMXBean&lt;/td&gt;
&lt;td&gt;Underlying operating system&lt;/td&gt;
&lt;td&gt;java.lang:type=OperatingSystem&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RuntimeMXBean&lt;/td&gt;
&lt;td&gt;Runtime system&lt;/td&gt;
&lt;td&gt;java.lang:type=Runtime&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThreadMXBean&lt;/td&gt;
&lt;td&gt;Thread system&lt;/td&gt;
&lt;td&gt;java.lang:type=Threading&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;platform-mbean-server&#34;&gt;Platform MBean Server&lt;/h3&gt;
&lt;p&gt;The Platform MBean Server can be shared by different managed components running within the same Java Virtual Machine. You can access the Platform MBean Server with the method ManagementFactory.getPlatformMBeanServer(). The first call to this method, creates the platform MBeanServer and registers the platform MXBeans using their unique ObjectNames. Subsequently, it returns the initially created platform MBeanServer.&lt;/p&gt;
&lt;p&gt;MXBeans that get created and destroyed dynamically, for example, memory pools and managers, will automatically be registered and deregistered into the platform MBeanServer.  If the system property &lt;code&gt;javax.management.builder.initial&lt;/code&gt; is set, the platform MBeanServer creation will be done by the specified MBeanServerBuilder.&lt;/p&gt;
&lt;p&gt;Use the platform MBeanServer to register other MBeans besides the platform MXBeans. This enables all MBeans to be published through the same MBeanServer and makes network publishing and discovery easier.&lt;/p&gt;
&lt;h4 id=&#34;now-in-this-java-code-we-create-a-mbean-and-see-it-in-visualvm&#34;&gt;Now in this Java code we create a MBean and see it In visualVm&lt;/h4&gt;
&lt;p&gt;in step 1&lt;/p&gt;
&lt;p&gt;lets create a &lt;code&gt;SystemStatusMBean&lt;/code&gt; to get some system related information&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SystemStatusMBean&lt;/span&gt; {
       Long &lt;span style=&#34;color:#447fcf&#34;&gt;getuptime&lt;/span&gt;();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This tells the MBeansServer by using dependency injection that this object will export 1 metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uptime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s write the actual object that implements this behaviour:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SystemStatus&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; SystemStatusMBean {
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Long uptime;
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Thread backgroundThread;

   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SystemStatus&lt;/span&gt;() {
       &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// First we initialize all the metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;backgroundThread&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread();
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;uptime&lt;/span&gt; = 0;

       &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// We will use a background thread to update the metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;backgroundThread&lt;/span&gt; = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Thread(() -&amp;gt; {
           &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
               &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;) {
                   &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Every second we update the metrics
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                   uptime += 1;
                   Thread.&lt;span style=&#34;color:#bbb&#34;&gt;sleep&lt;/span&gt;(1000L);
               }
           } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
               e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
           }
       });
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;backgroundThread&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;backgroundThread&amp;#34;&lt;/span&gt;);
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;backgroundThread&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;start&lt;/span&gt;();
   }


   &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Through this getters, defined in the interface SystemStatusMBean,
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;   &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// all the metrics will be automatically retrieved
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
   &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Long &lt;span style=&#34;color:#447fcf&#34;&gt;getUptime&lt;/span&gt;() {
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; uptime;
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;From the previous piece of code, you can see that you are simply creating an object that implements all the metrics from the interface, and will update them every second using a background thread.&lt;/p&gt;
&lt;p&gt;Finally, we create an instance of the MBean object and register it in the MBeanServer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;javax.management.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.lang.management.ManagementFactory&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day62&lt;/span&gt; {
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
           &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Initialize the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;           SystemStatus systemStatus = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SystemStatus();

           &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Register the object in the MBeanServer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;           MBeanServer platformMBeanServer = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getPlatformMBeanServer&lt;/span&gt;();
           ObjectName objectName = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectName(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;com.simple.app:name=SystemStatus&amp;#34;&lt;/span&gt;);
           platformMBeanServer.&lt;span style=&#34;color:#bbb&#34;&gt;registerMBean&lt;/span&gt;(systemStatus, objectName);

       } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
           e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
       }
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The MBean needs a &lt;code&gt;ObjectName&lt;/code&gt; to identify it within the MBeanServer. The name must contain a &lt;code&gt;domain&lt;/code&gt; to avoid collisions and keys. In this example, the domain would be &lt;code&gt;com.simple.app&lt;/code&gt; and the key would be &lt;code&gt;name=SystemStatus&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;now-lets-see-the-mbean-from-visualvm&#34;&gt;now lets see the MBean from VisualVM&lt;/h4&gt;
&lt;p&gt;After running the program it will run a thread in the background as &lt;code&gt;while(true)&lt;/code&gt; so after selecting the running program from visualvm we will get something like this&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1670572950/images-from-blog/Screenshot_from_2022-12-09_08-34-49_crystz.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;I have run this program in intellij Scratch so visualVM is registering it as that. Now if i click on the mbean menu i will see something like&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1670572950/images-from-blog/Screenshot_from_2022-12-09_08-35-09_vwpz8s.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;where we can see &lt;code&gt;com.simple.app&lt;/code&gt; which we have given in the &lt;code&gt;PlafromMBean&lt;/code&gt; registration. After expanding it we will see the name of the object which is &lt;code&gt;SystemStatus&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1670572950/images-from-blog/Screenshot_from_2022-12-09_08-36-26_loqy0l.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;after opening the SystemStatus we can see the &lt;code&gt;uptime&lt;/code&gt; that we have defined for getting the uptime of the program. This metric will be updated as per the program. So if we press &lt;code&gt;refresh&lt;/code&gt; then we can see the updated value of the uptime metric.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1670572950/images-from-blog/Screenshot_from_2022-12-09_08-36-31_mpqgyn.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Here the uptime metric changed from 14 to 61 seconds. So we can define metrics using mbeans and get information.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 61: Understanding JMX and its architecture (Management Level) </title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day61/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day61/</id>
    <published>2022-11-15T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding JMX and its architecture</summary>
    <content type="html">&lt;h3 id=&#34;what-is-jmx&#34;&gt;What is JMX&lt;/h3&gt;
&lt;p&gt;The Java Management Extensions (JMX) API is a standard for managing and monitoring applications and services.&lt;/p&gt;
&lt;p&gt;It defines -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;management architecture&lt;/li&gt;
&lt;li&gt;design patterns&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;for building web-based, distributed, dynamic, and modular solutions to manage Java-enabled resources. The JMX APIs make it possible to add manageability to Java-enabled applications, from web phones to set-top boxes to network devices and servers.&lt;/p&gt;
&lt;p&gt;The JVM gives you a set of MBeans through which you can access runtime data like &lt;strong&gt;memory consumption&lt;/strong&gt;, &lt;strong&gt;GC stats&lt;/strong&gt; and some more data. You can also invoke many operations. Your app server will also give you many MBeans which you can use to control the server and installed applications.&lt;/p&gt;
&lt;h3 id=&#34;jmx-overview&#34;&gt;JMX overview&lt;/h3&gt;
&lt;p&gt;The JMX technology is native to the Java programming language.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/management/package-summary.html&#34;&gt;java.lang.management&lt;/a&gt; package provides the interface for monitoring and managing the JVM.&lt;/p&gt;
&lt;p&gt;The API provides access to information such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Number of classes loaded and threads running&lt;/li&gt;
&lt;li&gt;Virtual machine uptime, system properties, and JVM input arguments&lt;/li&gt;
&lt;li&gt;Thread state, thread contention statistics, and stack trace of live threads&lt;/li&gt;
&lt;li&gt;Memory consumption&lt;/li&gt;
&lt;li&gt;Garbage collection statistics&lt;/li&gt;
&lt;li&gt;Low memory detection&lt;/li&gt;
&lt;li&gt;On-demand deadlock detection&lt;/li&gt;
&lt;li&gt;Operating system information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The API includes logging monitoring and management capabilities. The java.util.logging.LoggingMXBean interface provides for management of the logging facility.&lt;/p&gt;
&lt;p&gt;As a result, it offers natural, efficient, and lightweight management extensions to Java-based apps. It consists of a set of specifications and development tools for managing Java environments and developing state-of-the-art management solutions for applications and services. It provides Java developers with the means to instrumet Java code, create smart Java agents, implement distributed management middleware and managers, and integrate these solutions into existing management and monitoring systems (eg. APM)&lt;/p&gt;
&lt;p&gt;The dynamics of the JMX technology architecture enables you to use it to monitor and manage resources as they are implemented and installed. It can also be used to monitor and manage the jvm&lt;/p&gt;
&lt;h3 id=&#34;jmxs-layerd-architecture&#34;&gt;JMX&amp;rsquo;s layerd architecture&lt;/h3&gt;
&lt;p&gt;JMX technology provides a tiered architecture where managed resources and management applications can be integrated in the plug-and-play approach as shown in below image . A given resource is instrumented by one or more Java objects known as &lt;code&gt;Managed Beans (or MBeans)&lt;/code&gt;, which are registered in a core managed object server known as the &lt;code&gt;MBean server&lt;/code&gt;. This server acts as a management agent and can run on most Java-enabled devices.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://web.archive.org/web/20120609111042im_/http://java.sun.com/developer/technicalArticles/J2SE/fig1.gif&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;So in this part the topic of discussion will be the Manager Level. But before going into it let&amp;rsquo;s get a overview of all the levels&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instrumentation&lt;/td&gt;
&lt;td&gt;Resources, such as applications, devices, or services, are instrumented using Java objects called Managed Beans (MBeans). MBeans expose their management interfaces, composed of attributes and operations, through a JMX agent for remote management and monitoring.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;The main component of a JMX agent is the MBean server. This is a core managed object server in which MBeans are registered. A JMX agent also includes a set of services for handling MBeans. The JMX agent directly controls resources and makes them available to remote management agents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manager&lt;/td&gt;
&lt;td&gt;Protocol adaptors and standard connectors make a JMX agent accessible from remote management applications outside the agent’s Java Virtual Machine (JVM).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;manager-level&#34;&gt;Manager level:&lt;/h3&gt;
&lt;p&gt;JMX API instrumentation can be accessed through existing management protocols. For example Simple Network Management Protocol (SNMP). Another way is through proprietary protocols. The MBean server relies on protocol adaptors and connectors to make a JMX agent accessible from management applications outside the agent’s JVM.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/JMX_Architecture.svg/400px-JMX_Architecture.svg.png&#34; alt=&#34;Java Management Extensions - Wikipedia&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Each &lt;strong&gt;adaptor&lt;/strong&gt; provides a view through a specific protocol of all MBeans registered in the MBean server. For example, an HTML adaptor could display an MBean in a browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Connectors&lt;/strong&gt; provide a manager-side interface that handles the communication between the manager and the JMX agent. Each connector provides the same remote management interface though a different protocol. When a remote management application uses this interface, it can connect to a JMX agent transparently through the network, regardless of the protocol.&lt;/p&gt;
&lt;p&gt;A graphical JMX monitoring tool, &lt;code&gt;jconsole&lt;/code&gt;, enables us to monitor the performance of a JVM and instrumented applications, providing information to help you optimize performance.&lt;/p&gt;
&lt;p&gt;Now we are going to explore one of the connectors which will be used by &lt;code&gt;VisualVM&lt;/code&gt; which is different from Jconsole. JConsole uses only JMX, but VisualVM uses other monitoring technologies like Jvmstat, Attach API and SA in addition to JMX. It can merge data from all those monitoring technologies in one place and the user does not need to think which technology he should use in particular situation.&lt;/p&gt;
&lt;p&gt;VisualVM helps to get lot of information out about the JVM and how it&amp;rsquo;s performing. But we will only look into the jmx connection in VisualVM&lt;/p&gt;
&lt;h3 id=&#34;setup-visualvm-with-jmx-&#34;&gt;Setup VisualVM with JMX :&lt;/h3&gt;
&lt;p&gt;After downloading VisualVM when starting it will look for all the local JVM instances. Remote connections need to be added by specifying host and jmx port which needs to be setup while running the application as system property.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;-Dcom.&lt;span style=&#34;color:#bbb&#34;&gt;sun&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;management&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;jmxremote&lt;/span&gt;
-Dcom.&lt;span style=&#34;color:#bbb&#34;&gt;sun&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;management&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;jmxremote&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;port&lt;/span&gt;=9875
-Dcom.&lt;span style=&#34;color:#bbb&#34;&gt;sun&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;management&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;jmxremote&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;authenticate&lt;/span&gt;=&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;
-Dcom.&lt;span style=&#34;color:#bbb&#34;&gt;sun&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;management&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;jmxremote&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ssl&lt;/span&gt;=&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this configuration is for non-production use case as the port is open withou any SSL security. Here the jmx port will be 9875 and then we will need to connect to this port from visualvm. This port is by default given.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1669364856/images-from-blog/Screenshot_from_2022-11-25_07-22-24_ack8y7.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;now after connecting with jmx port in visualvm we will get to see something like this&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1669364856/images-from-blog/Screenshot_from_2022-11-25_07-28-12_qtvwcv.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;where there is tabs like &lt;strong&gt;monitor&lt;/strong&gt; ,&lt;strong&gt;threads&lt;/strong&gt;, &lt;strong&gt;sampler&lt;/strong&gt;, &lt;strong&gt;profiler&lt;/strong&gt; and many more extensions. By using these we can monitor&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cpu Usage&lt;/li&gt;
&lt;li&gt;Heap Size&lt;/li&gt;
&lt;li&gt;Threads and states of them&lt;/li&gt;
&lt;li&gt;Sample CPU and Memory usage&lt;/li&gt;
&lt;li&gt;Profiling&lt;/li&gt;
&lt;li&gt;Check Platform and Custom MBeans for JVM and applications&lt;/li&gt;
&lt;li&gt;VisualGC which helps to visualize GC&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1669364856/images-from-blog/Screenshot_from_2022-11-25_07-34-28_pvax9m.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;here we can see the memory and cpu usage of intellij IDE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In the next part will try to discuss about the Agent level of JMX&lt;/strong&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 60: Generating JVM heap dump programmatically </title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day60/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day60/</id>
    <published>2022-11-11T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Generating JVM heap dump using PlatformMBeanServer</summary>
    <content type="html">&lt;h3 id=&#34;heap-in-jvm&#34;&gt;Heap in JVM&lt;/h3&gt;
&lt;p&gt;At first before we dump the heap we should unnderstand what is the Heap and why should we dump it. In JVM The Java heap is the area of memory used to store objects instantiated by applications running on the JVM. When the JVM is started, heap memory is created and any objects in the heap can be shared between threads as long as the application is running. The size of the heap can vary, so many users restrict the Java heap size to 2-8 GB in order to minimize garbage collection pauses.&lt;/p&gt;
&lt;h3 id=&#34;why-dump-heap-memory&#34;&gt;Why dump Heap Memory&lt;/h3&gt;
&lt;p&gt;A heap dump is a snapshot of all the objects that are in memory in the JVM at a certain moment. They are very useful to troubleshoot memory-leak problems and optimize memory usage in Java applications.&lt;/p&gt;
&lt;p&gt;Heap dumps are usually stored in &lt;code&gt;binary format hprof files&lt;/code&gt;. We can open and analyze these files using tools like &lt;code&gt;JVisualVM&lt;/code&gt; and &lt;code&gt;Eclipse Memory Analyzing Tool&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To generate a heap dump we first need to get a connection to heap and then create the heap dump file. So to that we need the help of java&amp;rsquo;s &lt;code&gt;JMX&lt;/code&gt; framework.&lt;/p&gt;
&lt;h3 id=&#34;what-is-jmx&#34;&gt;What is JMX&lt;/h3&gt;
&lt;p&gt;Java Management Extensions (JMX) is a standard component of the Java Platform.  It was first added to the J2SE 5.0 release. It is a set of  specifications used for network and application management. It specifies  a method for developers to integrate the applications they are working  on with their network management software by assigning Java objects with  management attributes.&lt;/p&gt;
&lt;p&gt;JMX gives developers a standard and simple way to manage resources. Including services, devices, and applications. It is dynamic, making it  possible to manage and monitor resources as soon as they are created,  implemented or installed.&lt;/p&gt;
&lt;h3 id=&#34;what-is-mbean-and-mbeanserver&#34;&gt;What is MBean and MBeanServer&lt;/h3&gt;
&lt;p&gt;With Java Management Extensions technology, a resource is represented by Managed Beans or mBeans.  These are registered on the mBean server. It is a core-managed object server  that acts as an agent and can be used on a majority of devices that  support Java.&lt;/p&gt;
&lt;p&gt;In simpler terms, mBeans acts like Java wrappers for&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;components&lt;/li&gt;
&lt;li&gt;devices&lt;/li&gt;
&lt;li&gt;applications&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;in a distributed network.&lt;/p&gt;
&lt;p&gt;MBean server provides the actual management, as it is where you would  find all the manageable resources. This server then becomes the central  focus of the architectural frame. which allow the server components to plug  in and find manageable objects.&lt;/p&gt;
&lt;p&gt;A JMX agent, would consist of the mBean server, and the services needed to handle the mBeans (you’ll also want an APM solution  that includes application framework metrics like mBeans and performance  counters). This means that the resources are independent and apart from  the management infrastructure. while these resources are manageable no  matter how the management applications are deployed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So now by using these MBeans and MBeanServer&amp;rsquo;s we can get many inforamtions about the JVM and the application that its hosting.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;doing-heap-dump-programatically&#34;&gt;Doing Heap Dump Programatically&lt;/h3&gt;
&lt;p&gt;At first we need to call the &lt;code&gt;PlatformMBeanServer&lt;/code&gt; to get the platform informations of JVM and then with those information need to access &lt;code&gt;HotSpotDiagnosticMXBean&lt;/code&gt; whic is an Management Extension Bean different from typical MBean.&lt;/p&gt;
&lt;p&gt;So let us understand what is and MXBean&lt;/p&gt;
&lt;h4 id=&#34;mxbean&#34;&gt;MXBean&lt;/h4&gt;
&lt;p&gt;MXBeans are just a special kind of MBeans. The main difference is that MXBean restrict the data types, so that they are &amp;ldquo;more compatible&amp;rdquo; with potential clients.&lt;/p&gt;
&lt;p&gt;As example: a MBean can expose attributes of a data type &lt;code&gt;Foo&lt;/code&gt;. Now the client also needs to have this type &lt;code&gt;Foo&lt;/code&gt; to make sense of the attribute.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;MXBean&lt;/code&gt; tries to restrict the data types to those &lt;code&gt;already available&lt;/code&gt; e.g. - java.lang.* etc.&lt;/p&gt;
&lt;h4 id=&#34;procedure&#34;&gt;procedure&lt;/h4&gt;
&lt;p&gt;To extract a heap dump&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At first need to get &lt;code&gt;PlatformMXBeanServer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;From that need to get the specific MXBean in this case &lt;code&gt;HotSpotDiagnotsicMXBean&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;As the procedure is not thread safe we need to sychronize it&lt;/li&gt;
&lt;li&gt;Now we need to call the &lt;code&gt;dumpHeap&lt;/code&gt; method on HotSpotDiagnotic&lt;/li&gt;
&lt;li&gt;To call this method we need to pass file name (with &lt;code&gt;.hprof&lt;/code&gt; extension) and boolean option to get information about live objects in the heap.&lt;/li&gt;
&lt;li&gt;It will return the file in the specified locaiton&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;code&#34;&gt;Code&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day60&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String HotSpotBeanName = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;com.sun.management:type=HotSpotDiagnostic&amp;#34;&lt;/span&gt;;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        String timestamp = LocalDateTime.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Dumping heap&amp;#34;&lt;/span&gt;);
        generateHeapDump(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibul/Documents/heapdump_&amp;#34;&lt;/span&gt;+timestamp+&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.hprof&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;generateHeapDump&lt;/span&gt;(String fileName, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isLive) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (hotSpotDiagnosticMXBean == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; (Day60.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;) {
                hotSpotDiagnosticMXBean = getHotSpotDiagnosticMXBean();
            }
        }

        hotSpotDiagnosticMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;dumpHeap&lt;/span&gt;(fileName,isLive);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; HotSpotDiagnosticMXBean &lt;span style=&#34;color:#447fcf&#34;&gt;getHotSpotDiagnosticMXBean&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        MBeanServer mBeanServer = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getPlatformMBeanServer&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;newPlatformMXBeanProxy&lt;/span&gt;(mBeanServer, HotSpotBeanName, HotSpotDiagnosticMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Day 59: Understanding Proxy and Dynamic Proxy in Java</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day59/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day59/</id>
    <published>2022-11-04T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding Proxy and Dynamic Proxy in Java</summary>
    <content type="html">&lt;h3 id=&#34;proxy&#34;&gt;Proxy&lt;/h3&gt;
&lt;p&gt;Proxy is a design pattern. We create and use proxy objects when we want to add or change some functionality of an existing class. The proxy object is used instead of the original one. Usually, the proxy objects have the same methods as the original one. In Java proxy classes usually extend the original class. The proxy has a handle to the original object and can call the method on that.&lt;/p&gt;
&lt;p&gt;A proxy, in its most general form, is a class functioning as an interface to something else. In layman’s term, a proxy class in java is a class that delegates responsibility “in-place of” or “on behalf of” another class. The object, a proxy imitates is called the implementation object.&lt;/p&gt;
&lt;h3 id=&#34;types-of-proxy-in-java&#34;&gt;Types of Proxy in java&lt;/h3&gt;
&lt;p&gt;There are mainly 2 types of Proxy in Java&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Static Proxy&lt;/li&gt;
&lt;li&gt;Dynamic Proxy&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;static-proxy&#34;&gt;Static Proxy&lt;/h4&gt;
&lt;p&gt;Proxies that are written manually are referred to as static proxies. The following example is for a statc proxy&lt;/p&gt;
&lt;p&gt;At first we can create an interface to be shared among the proxy and the real class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;User&lt;/span&gt; {
	String &lt;span style=&#34;color:#447fcf&#34;&gt;getType&lt;/span&gt;();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now that we have an interface we can have its implementation of a particular user.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FreeUser&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; User {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getType&lt;/span&gt;() {
    	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;free&amp;#34;&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now we can create a &lt;code&gt;Proxy&lt;/code&gt; interface that will extend User interface to get its behaviors which can be proxied by its implementations.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ProxyUser&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; User {
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So &lt;code&gt;FreeUserProxy&lt;/code&gt; can be implemented by implementing &lt;code&gt;ProxyUser&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FreeUserProxy&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; ProxyUser {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; FreeUser freeUser = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FreeUser();
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger log = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(FreeUserProxy.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getType&lt;/span&gt;() {
    	log.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;getType() called&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; freeUser.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now running the code from main class&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day59&lt;/span&gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String [] args) {
    	User user = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FreeUserProxy();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(user.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;usage&#34;&gt;Usage&lt;/h4&gt;
&lt;p&gt;Proxy pattern is used when we need to create a wrapper to cover the main object’s complexity from the client. Furthermore we can add additional behavior on the proxy object that can augment the proxied object.&lt;/p&gt;
&lt;h4 id=&#34;advantages&#34;&gt;Advantages&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A proxy can hide complex tasks such as making network communication, transaction management without changing the implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proxies can be used to insert custom behaviour/code on top of and without changing the implementation object. Sometimes the code of an external library is inaccessible to edit, custom behaviour can be inserted pre/post-execution of the method provided by such library. For example, you can write a proxy for java.net.HttpUrlConnection class to log all the external service call request without changing the implementation of HttpUrlConnection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of the other advantages of the proxy pattern is security. A remote proxy can be used to provide a proxy stub in client and call the implementation on the server.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;disadvantages&#34;&gt;Disadvantages&lt;/h4&gt;
&lt;p&gt;Sometimes static proxy can violate the dry principle, e.x The static proxy class defined is very specific to an implementation which means for every implementation a proxy needs to be explicitly defined and is a repeated work.&lt;/p&gt;
&lt;p&gt;Consider a scenario where you have to implement a proxy to count method invocation for multiple class. If you are using a static proxy you will be defining multiple proxy class with duplicate logic over and over again.&lt;/p&gt;
&lt;p&gt;In the example above through proxy, we are counting method invocation using a single line. If a proxy had 100 lines of code to persist a data in the database, and a bug was found in just one line, you would have to remember to change that line in each bit of duplicated code, throughout tens, or even hundreds, of additional proxies.&lt;/p&gt;
&lt;h3 id=&#34;dynamic-proxy&#34;&gt;Dynamic proxy&lt;/h3&gt;
&lt;p&gt;Dynamic proxy is the proxy design pattern, in which the proxy object is created dynamically during runtime.&lt;/p&gt;
&lt;p&gt;Proxy design pattern uses a proxy. which acts as a mediator between client and underlying real object. Programmer can perform access control, validation and additional action in proxy before delegating the request to real object.&lt;/p&gt;
&lt;p&gt;Form the disadvantages of the &lt;code&gt;static&lt;/code&gt; proxy, if we somehow at runtime we are able to create a proxy object based on the client&amp;rsquo;s call and then perform generic action(logging action in our case) before delegating the call to the real object? Well, that is what dynamic proxies does.&lt;/p&gt;
&lt;p&gt;The process in case of dynamic proxy is as following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;client calls some action on an object.&lt;/li&gt;
&lt;li&gt;system creates a proxy object at runtime based on client&amp;rsquo;s call.&lt;/li&gt;
&lt;li&gt;proxy object calls a generic method to perform a generic action in case of each call.&lt;/li&gt;
&lt;li&gt;after the action, proxy object delegates the call to real object.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So in a nutshell, if you have some generic action to perform, use dynamic proxy, but if you want each class to be treated differenlty (in some classes perform logging, in some don&amp;rsquo;t, in some access control etc.) use simple proxy.&lt;/p&gt;
&lt;p&gt;Now to create a dynamic proxy in java we can use Java Reflection to create dynamic implementations of interfaces at runtime. By using the class &lt;code&gt;java.lang.reflect.Proxy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dynamic proxies can be used for many different purposes, e.g. database connection and transaction management, dynamic mock objects for unit testing, and other AOP-like method intercepting purposes.&lt;/p&gt;
&lt;p&gt;We create dynamic proxies using the &lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt; method. The newProxyInstance() methods takes 3 parameters:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The ClassLoader that is to &lt;strong&gt;load&lt;/strong&gt; the dynamic proxy class.&lt;/li&gt;
&lt;li&gt;An array of interfaces to implement.&lt;/li&gt;
&lt;li&gt;An InvocationHandler to forward all methods calls on the proxy to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;InvocationHandler handler = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; UserInvocationHandler();
User proxy = (User) Proxy.&lt;span style=&#34;color:#bbb&#34;&gt;newProxyInstance&lt;/span&gt;(
                            User.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getClassLoader&lt;/span&gt;(),
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Class[] { User.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt; },
                            handler);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After running this code the proxy variable contains a dynamic implementation of the &lt;code&gt;Vehicle&lt;/code&gt; interface. All calls to the proxy will be forwarded to the handler implementation of the general InvocationHandler interface.&lt;/p&gt;
&lt;h4 id=&#34;invocationhandler&#34;&gt;InvocationHandler&lt;/h4&gt;
&lt;p&gt;As mentioned earlier you must pass an InvocationHandler implementation to the &lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt; method. All method calls to the dynamic proxy are forwarded to this InvocationHandler implementation. Here is how the InvocationHandler interface looks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;InvocationHandler&lt;/span&gt;{
  Object &lt;span style=&#34;color:#447fcf&#34;&gt;invoke&lt;/span&gt;(Object proxy, Method method, Object[] args)
         &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Throwable;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The proxy parameter passed to the &lt;code&gt;invoke()&lt;/code&gt; method is the dynamic proxy object implementing the interface. Most often you don&amp;rsquo;t need this object.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Method&lt;/code&gt; object passed into the invoke() method represents the method called on the interface the dynamic proxy implements. From the Method object you can obtain the method name, parameter types, return type, etc.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Object[]&lt;/code&gt; args array contains the parameter values passed to the proxy when the method in the interface implemented was called. Note: Primitives (int, long etc) in the implemented interface are wrapped in their object counterparts (Integer, Long etc.).&lt;/p&gt;
&lt;p&gt;Now for example writing a &lt;code&gt;GenericLogger&lt;/code&gt; class that will log method invocation by intercepting the method invocation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;
 &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;GenericLogger&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; InvocationHandler {
 	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Object target;
 	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;GenericLogger&lt;/span&gt;(Object target) {
    	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;target&lt;/span&gt; = target;
    }
 	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;invoke&lt;/span&gt;(Object proxy, Method m, Object[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Throwable {
 		System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Generic Logger Entry: Invoking &amp;#34;&lt;/span&gt; +
 		m.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
 		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; m.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(target, args);
 	}
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now to invoke the proxy from main class&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day59&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        User user = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FreeUser();
        ClassLoader cl = User.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getClassLoader&lt;/span&gt;();
        User u = (User) Proxy.&lt;span style=&#34;color:#bbb&#34;&gt;newProxyInstance&lt;/span&gt;(cl,
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Class[] {User.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;}, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; GenericLogger(c));
        u.&lt;span style=&#34;color:#bbb&#34;&gt;getType&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;known-use-cases&#34;&gt;Known Use Cases&lt;/h4&gt;
&lt;p&gt;Dynamic proxies are known to be used for at least the following purposes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Database Connection and Transaction Management&lt;/li&gt;
&lt;li&gt;Dynamic Mock Objects for Unit Testing&lt;/li&gt;
&lt;li&gt;Adaptation of DI Container to Custom Factory Interfaces&lt;/li&gt;
&lt;li&gt;AOP-like Method Interception&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;advantages-1&#34;&gt;Advantages&lt;/h4&gt;
&lt;p&gt;It can be used as decorator to provide some extra ability to proxied objects and all the other benifits of static proxy and not its disadvantages.&lt;/p&gt;
&lt;h4 id=&#34;disadvantages-1&#34;&gt;Disadvantages&lt;/h4&gt;
&lt;p&gt;It uses the java Reflection Api which tends to be slow in performance and object creation. Will also feel magical if not have a good understanding how dynamic proxy is working and creating proxy in the runtime&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 58: Mocking void methods using ArgumentCapture and Answering</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day58/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day58/</id>
    <published>2022-10-23T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Mocking void methods using ArgumentCapture and Answering</summary>
    <content type="html">&lt;p&gt;When unit testing any java class which have void methods inside it and also needed to be mocked. Then we mock them in 4 ways using mockito&amp;rsquo;s mocking method&amp;rsquo;s and they are -&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1667032140/images-from-blog/mockito-mocking-void-method.drawio_e1afrl.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;doNothing() &amp;amp; ArgumentCapture&lt;/li&gt;
&lt;li&gt;doThrow()&lt;/li&gt;
&lt;li&gt;doAnswer()&lt;/li&gt;
&lt;li&gt;doCallRealMethod()&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;donothing-&#34;&gt;doNothing() :&lt;/h3&gt;
&lt;p&gt;when using doNothing() as its name suggest it does nothing. So when verifying we need to verify if the method is called or not.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;add&lt;/span&gt;(Number a, Number b) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; Integer &amp;amp;&amp;amp; b &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt;  Integer) {
            addInt(a.&lt;span style=&#34;color:#bbb&#34;&gt;intValue&lt;/span&gt;(), b.&lt;span style=&#34;color:#bbb&#34;&gt;intValue&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; Double &amp;amp;&amp;amp; b &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; Double) {
            addDouble(a.&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;(), b.&lt;span style=&#34;color:#bbb&#34;&gt;doubleValue&lt;/span&gt;());
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;if this add() method is tested with doNothing() it will just invoke it and then verify whether it was invoked or not. So the test would be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;whenAddCalledVerified&lt;/span&gt;() {
    Scratch scratch = mock(Scratch.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    doNothing().&lt;span style=&#34;color:#bbb&#34;&gt;when&lt;/span&gt;(scratch).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(anyInt(), anyInt());
 
    verify(scratch, times(1)).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(1, 1);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;donothing--argumentcaptor-&#34;&gt;doNothing() + ArgumentCaptor :&lt;/h3&gt;
&lt;p&gt;So before going into how this helps mocking void method. Let us learn about what is &lt;code&gt;ArgumentCaptor&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;arugmentcaptor&#34;&gt;ArugmentCaptor&lt;/h4&gt;
&lt;p&gt;ArgumentCaptor allows us to capture an argument passed to a method to inspect it. This is useful when we can&amp;rsquo;t access the argument outside of the method we&amp;rsquo;d like to test.&lt;/p&gt;
&lt;p&gt;To see it in action first we need to setup a method and test.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BookService&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; BookMeta bookMeta;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;printBook&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; id, Book book) {
        BookMeta meta = getBookMetaInfoById(id);
        meta.&lt;span style=&#34;color:#bbb&#34;&gt;addBookMetaInfo&lt;/span&gt;(book);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(book.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;So now to test this printBook method we need to setup a test&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@RunWith&lt;/span&gt;(MockitoJUnitRunner.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BookTest&lt;/span&gt; {
	String bookTitle = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Kill It With Fire&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Mock&lt;/span&gt;
    BookMeta bookMeta;

    &lt;span style=&#34;color:#ffa500&#34;&gt;@InjectMocks&lt;/span&gt;
    BookService bookService;
    
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Captor&lt;/span&gt;
	ArgumentCaptor&amp;lt;Book&amp;gt; bookCap;
    
    bookService.&lt;span style=&#34;color:#bbb&#34;&gt;printBook&lt;/span&gt;(1, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Book(bookTitle));
  
    Mockito.&lt;span style=&#34;color:#bbb&#34;&gt;verify&lt;/span&gt;(bookMeta).&lt;span style=&#34;color:#bbb&#34;&gt;addBookMetaInfo&lt;/span&gt;(bookCap.&lt;span style=&#34;color:#bbb&#34;&gt;capture&lt;/span&gt;());
    Book capturedBook = bookCap.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;();
    assertEquals(capturedBook.&lt;span style=&#34;color:#bbb&#34;&gt;getTitle&lt;/span&gt;(), bookTitle);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this code we can see there is an implementation of a &lt;code&gt;BookService&lt;/code&gt;. In that a method is implemented named &lt;code&gt;findBookById&lt;/code&gt; which uses another 2 services named &lt;code&gt;BookEntityService&lt;/code&gt; and &lt;code&gt;BookMetaEntityService&lt;/code&gt; each provides some book and some related information.&lt;/p&gt;
&lt;p&gt;we define an &lt;code&gt;ArgumentCaptor&amp;lt;Book&amp;gt;&lt;/code&gt; with annotation &lt;code&gt;@Captor&lt;/code&gt;. then we capture it while verifying the call &lt;code&gt;addBookMetaInfo&lt;/code&gt; call and then verify the value with assertion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This use case is well suited when the arguments is manipulated in the void method we are mocking.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;dothrow&#34;&gt;doThrow():&lt;/h3&gt;
&lt;p&gt;This method can help to verify if a method throws any exception and based on that we can test some execution path.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;add()&lt;/code&gt; method we can check for addition overflow and throw a exception so that we can verify the execution path.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;(expected = Exception.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;)
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;givenNull_addThrowsException&lt;/span&gt;() {
    Scratch scratch = mock(Scratch.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    doThrow().&lt;span style=&#34;color:#bbb&#34;&gt;when&lt;/span&gt;(scratch).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(any(), &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
 
    scratch.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(1, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;doanswer&#34;&gt;doAnswer()&lt;/h3&gt;
&lt;p&gt;Answer is used when you need to do additional actions when a mocked method is invoked, e.g. when you need to compute the return value based on the parameters of this method call. So Use doAnswer() when we want to stub a void method with generic Answer. Answer specifies an action that is executed and a return value that is returned when you interact with the mock.&lt;/p&gt;
&lt;p&gt;so we can make answer to &lt;code&gt;add()&lt;/code&gt; method and to verfiy execution.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;whenAddCalledAnswered&lt;/span&gt;() {
    Scratch scratch = mock(Scratch.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    doAnswer(invocation -&amp;gt; {
        Object arg0 = invocation.&lt;span style=&#34;color:#bbb&#34;&gt;getArgument&lt;/span&gt;(0);
        Object arg1 = invocation.&lt;span style=&#34;color:#bbb&#34;&gt;getArgument&lt;/span&gt;(1);
        
        assertEquals(1, arg0);
        assertEquals(1, arg1);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }).&lt;span style=&#34;color:#bbb&#34;&gt;when&lt;/span&gt;(scratch).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(anyInt(), anyInt());
    scratch.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(1,1);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Also another common usage of Answer is to stub asynchronous methods that have callbacks. For example, we have mocked the interface below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;BookService&lt;/span&gt; {
  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;get&lt;/span&gt;(Callback callback);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here you’ll find that &lt;code&gt;when-thenReturn&lt;/code&gt; is not that helpful anymore. Answer is the replacement. For example, we can emulate a success by calling the &lt;code&gt;onSuccess&lt;/code&gt; function of the callback.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testOnSuccess&lt;/span&gt;() {
    BookService bookService = mock(BookService.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    doAnswer(invocation -&amp;gt; {
         Callback callback = (Callback) invocation.&lt;span style=&#34;color:#bbb&#34;&gt;getArguments&lt;/span&gt;(0);
       	 callback.&lt;span style=&#34;color:#bbb&#34;&gt;onSuccess&lt;/span&gt;(data);
         &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }).&lt;span style=&#34;color:#bbb&#34;&gt;when&lt;/span&gt;(bookService).&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(any(Callback.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;));
    
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;docallrealmethod&#34;&gt;doCallRealMethod()&lt;/h3&gt;
&lt;p&gt;By calling this method we can achive partial mocking of method. When we Mock an object and then make a reference to any method using mocked object reference. java never makes a call to that method and looks for mocked value to be returned or null if none specified. But If we want that to be overridden and want java to make actual method call upon using mocked object reference, this method can be used.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@Test&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;whenAddCalledRealMethodCalled&lt;/span&gt;() {
    Scratch scratch = mock(Scratch.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    doCallRealMethod().&lt;span style=&#34;color:#bbb&#34;&gt;when&lt;/span&gt;(scratch).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(anyInt(), anyInt());
    scratch.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(1,1);
 
    verify(scratch, times(1)).&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(1, 1);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Although I found only these way&amp;rsquo;s of mocking void methods in junit and mockito. There might be many other ways we can achive mocking the void method calls.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 57: All about Random in Java ( Random, SecureRandom,ThreadLocalRandom and SplittableRandom)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day57/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day57/</id>
    <published>2022-10-13T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding details and compare use cases  of Random, ThreadLocalRandom and SecureRandom</summary>
    <content type="html">&lt;p&gt;To generate random numbers in java there are 4 given ways by the api. In java 17 new generic api and some other api&amp;rsquo;s was introduced.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Random Class&lt;/li&gt;
&lt;li&gt;ThreadLocalRandom Class&lt;/li&gt;
&lt;li&gt;SecureRandom Class&lt;/li&gt;
&lt;li&gt;SplitabbleRandom Class&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.baeldung.com/wp-content/uploads/2022/01/2022-01-02-09_17_03-rng_old_api.png-_-Fotografije.png&#34; alt=&#34;&#34;  /&gt;
Fig: Java 17 new RandomGenerator Interface.&lt;/p&gt;
&lt;h3 id=&#34;random&#34;&gt;Random:&lt;/h3&gt;
&lt;p&gt;The Random Class of the java.util package is used for generating a stream of pseudorandom numbers. It uses a 48-bit seed, and using a &lt;code&gt;Linear Congruential Formula&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If we create two instances of the Random class with the same seed value and call the same sequence of methods for each . They both will return identical sequences of numbers. This property is enforced by specific algorithms defined for this class. The algorithms use a protected utility method which upon invocation can give up to 32 pseudorandomly generated bits.&lt;/p&gt;
&lt;p&gt;Instances of &lt;code&gt;Random are thread–safe&lt;/code&gt;. Although, if the same instances are used across threads they may suffer from &lt;code&gt;contention&lt;/code&gt; and result in poor performance. The Instances of Random are &lt;code&gt;not cryptographically safe&lt;/code&gt;. So should not be used for security-sensitive applications.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day57&lt;/span&gt; {
  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
  	  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; seed = 5;
      
      Random rng1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random(seed)
      System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(rng.&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;());
      Random rng2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random(seed)
      System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(rng.&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;());
      
      
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random(seed).&lt;span style=&#34;color:#bbb&#34;&gt;ints&lt;/span&gt;(5, 10, 100)
                  .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;threadlocalrandom&#34;&gt;ThreadLocalRandom:&lt;/h3&gt;
&lt;p&gt;ThreadLocalRandom is a combination of the &lt;code&gt;ThreadLocal&lt;/code&gt; and &lt;code&gt;Random&lt;/code&gt; classes. Its isolated to the current thread. So it achieves better performance in a multi-threaded environment. It avoids any concurrent access to instances of Random.&lt;/p&gt;
&lt;p&gt;The random number obtained by one thread is not affected by the other thread. Whereas java.util.Random provides random numbers globally.&lt;/p&gt;
&lt;p&gt;Also, unlike Random, ThreadLocalRandom doesn&amp;rsquo;t support setting the seed explicitly. Instead, it overrides the &lt;code&gt;setSeed(long seed)&lt;/code&gt; method. Its inherited from Random and always throw an UnsupportedOperationException if called.&lt;/p&gt;
&lt;p&gt;So now we will take a detour and try to understand what is &lt;code&gt;Thread contention&lt;/code&gt; which is the reason behind &lt;code&gt;Random classes result in poor performance while being in multi-threaded env&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;thread-contention&#34;&gt;Thread Contention:&lt;/h4&gt;
&lt;p&gt;when two threads try to access either the same resource or related resources. At least one of the contending threads runs slower than it would if the other thread(s) were not running. This situation is called thread contention.&lt;/p&gt;
&lt;p&gt;The most obvious example of contention is on a lock. If thread A has a lock and thread B wants to acquire that same lock, thread B will have to wait until thread A releases the lock.&lt;/p&gt;
&lt;p&gt;For example, consider a thread that acquires a lock, modifies an object, then releases the lock and does some other things. If two threads are doing this, even if they never fight for the lock, the threads may run much slower than they would if only one thread was running.&lt;/p&gt;
&lt;p&gt;Why? Say each thread is running on its own core on a modern x86 CPU and the cores don&amp;rsquo;t share an L2 cache. With just one thread, the object may remain in the L2 cache most of the time. With both threads running, each time one thread modifies the object, the other thread will find the data is not in its L2 cache because the other CPU invalidated the cache line.&lt;/p&gt;
&lt;p&gt;So far, we can see that the Random class performs poor in highly concurrent environments. To better understand this, let&amp;rsquo;s see how one of its primary operations, &lt;code&gt;next(int)&lt;/code&gt;, is implemented&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * Generates the next pseudorandom number. Subclasses should
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * override this, as this is used by all other methods.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * &amp;lt;p&amp;gt;The general contract of {@code next} is that it returns an
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * {@code int} value and if the argument {@code bits} is between
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * {@code 1} and {@code 32} (inclusive), then that many low-order
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * bits of the returned value will be (approximately) independently
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * chosen bit values, each of which is (approximately) equally
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * likely to be {@code 0} or {@code 1}. The method {@code next} is
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * implemented by class {@code Random} by atomically updating the seed to
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *  &amp;lt;pre&amp;gt;{@code (seed * 0x5DEECE66DL + 0xBL) &amp;amp; ((1L &amp;lt;&amp;lt; 48) - 1)}&amp;lt;/pre&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * and returning
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *  &amp;lt;pre&amp;gt;{@code (int)(seed &amp;gt;&amp;gt;&amp;gt; (48 - bits))}.&amp;lt;/pre&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * This is a linear congruential pseudorandom number generator, as
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * defined by D. H. Lehmer and described by Donald E. Knuth in
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * &amp;lt;i&amp;gt;The Art of Computer Programming,&amp;lt;/i&amp;gt; Volume 2:
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * &amp;lt;i&amp;gt;Seminumerical Algorithms&amp;lt;/i&amp;gt;, section 3.2.1.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * @param  bits random bits
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * @return the next pseudorandom value from this random number
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    *         generator&amp;#39;s sequence
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    * @since  1.1
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;    */&lt;/span&gt;
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;next&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; bits) {
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; oldseed, nextseed;
       AtomicLong seed = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;seed&lt;/span&gt;;
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;do&lt;/span&gt; {
           oldseed = seed.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
           nextseed = (oldseed * multiplier + addend) &amp;amp; mask;
       } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (!seed.&lt;span style=&#34;color:#bbb&#34;&gt;compareAndSet&lt;/span&gt;(oldseed, nextseed));
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;)(nextseed &amp;gt;&amp;gt;&amp;gt; (48 - bits));
   }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This portion of code is copied from openJDK and here we can see it implements &lt;code&gt;Linear Congruential Generator&lt;/code&gt; algo to generate pseudo random numbers.It&amp;rsquo;s obvious that all threads are sharing the same seed instance variable.&lt;/p&gt;
&lt;p&gt;To generate the next random set of bits, it first tries to change the shared seed value atomically via &lt;code&gt;compareAndSet&lt;/code&gt; or &lt;code&gt;CAS&lt;/code&gt; for short.&lt;/p&gt;
&lt;p&gt;When multiple threads attempt to update the seed concurrently using CAS, one thread wins and updates the seed, and the rest lose. Losing threads will try the same process over and over again until they get a chance to update the value and ultimately generate the random number.&lt;/p&gt;
&lt;p&gt;This algorithm is &lt;code&gt;lock-free&lt;/code&gt; , and different threads can progress concurrently. However, when the contention is high, the number of CAS failures and retries will hurt the overall performance significantly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the other hand, the ThreadLocalRandom completely removes this contention, as each thread has its own instance of Random and, consequently, its own confined seed.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;current-in-threadlocalrandom&#34;&gt;current() in ThreadLocalRandom&lt;/h3&gt;
&lt;p&gt;This method returns ThreadLocalRandom instance for the current thread. ThreadLocalRandom can be initialized as below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;ThreadLocalRandom  random = ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;();
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;nextInt(int least,int bound) returns the next pseudo number . We can pass the least limit and max limit. There are more method like nextDouble, nextLong. So finally we can get random number as below&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(1, 10);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now writing a simple implementation of ThreadLocalRandom.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day57&lt;/span&gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
		ForkJoinPool pool = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ForkJoinPool();
		TestTask task1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TestTask(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task one&amp;#34;&lt;/span&gt;);
		TestTask task2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TestTask(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Task two&amp;#34;&lt;/span&gt;);
		pool.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(task1);
		pool.&lt;span style=&#34;color:#bbb&#34;&gt;invoke&lt;/span&gt;(task2);
    }
}	
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;TestTask&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ForkJoinTask&amp;lt;String&amp;gt; {
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; String str = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;TestTask&lt;/span&gt;(String str){
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;str&lt;/span&gt; = str;
	}
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; serialVersionUID = 1L;
	&lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;exec&lt;/span&gt;() {
	   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = ThreadLocalRandom.&lt;span style=&#34;color:#bbb&#34;&gt;current&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(1, 10);		
	   System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;ThreadLocalRandom for &amp;#34;&lt;/span&gt;+str+&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;+i);
	   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
	}
	&lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getRawResult&lt;/span&gt;() {
		&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
	}
	&lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;setRawResult&lt;/span&gt;(String value) {
	}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In the example there is a ForkJoinTask implementation. Also inside exec() method of ForkJoinTask, we obtained the random number by ThreadLocalRandom. We have run two ForkJoinTask to test the random number generation. Run the example many time and every time you will get random numbers. Sample output is as below.&lt;/p&gt;
&lt;h3 id=&#34;securerandom&#34;&gt;SecureRandom&lt;/h3&gt;
&lt;p&gt;Standard JDK implementations of java.util.Random use a Linear Congruential Generator (LCG) algorithm for providing random numbers. The problem with this algorithm is that it’s not cryptographically strong. In other words, the generated values are much more predictable, therefore attackers could use it to compromise our system.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;java.security.SecureRandom&lt;/code&gt; class does not actually implement a pseudorandom number generator (PRNG) itself. It uses PRNG implementations in other classes to generate random numbers. So the randomness of the random numbers and security and performance of SecureRandom depends on the algorithm chosen. If you want &lt;strong&gt;cryptographically strong&lt;/strong&gt; randomness, then you need a strong entropy source. &lt;strong&gt;Entropy&lt;/strong&gt; here refers to the randomness collected by an operating system or application. The entropy source is one which collects random data and supplies to destination.&lt;/p&gt;
&lt;p&gt;The file which controls the configuration of the SecureRandom API is located at:  &lt;code&gt;$JAVA_HOME/lib/security/java.security&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We can select the source of seed data for SecureRandom by using the entropy gathering device specified in securerandom.source property in java.security file.&lt;/p&gt;
&lt;p&gt;E.g.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-securerandom.source=file:/dev/urandom&#34; data-lang=&#34;securerandom.source=file:/dev/urandom&#34;&gt;securerandom.source=file:/dev/random
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Way of initializing a SecureRandom and get a cryptographycally strong secure random numbers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;SecureRandom random = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SecureRandom();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] values = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[20];
random.&lt;span style=&#34;color:#bbb&#34;&gt;nextBytes&lt;/span&gt;(values);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;another way of creating instance will be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;SecureRandom random = SecureRandom.&lt;span style=&#34;color:#bbb&#34;&gt;getInstanceStrong&lt;/span&gt;();
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] values = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[20];
random.&lt;span style=&#34;color:#bbb&#34;&gt;nextBytes&lt;/span&gt;(values);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this &lt;code&gt;getInstanceStrong()&lt;/code&gt; is a blocking call.&lt;/p&gt;
&lt;p&gt;Difference between them : the first instance uses &lt;code&gt;/dev/urandom&lt;/code&gt;. The second instance uses &lt;code&gt;/dev/random&lt;/code&gt;. /dev/random blocks the thread if there isn&amp;rsquo;t enough randomness available. Whereas /dev/urandom will never block.&lt;/p&gt;
&lt;p&gt;Believe it or not, there is no advantage in using /dev/random over /dev/urandom. They use the same pool of randomness under the hood. They are equally secure. If you want to safely generate random numbers, you should use /dev/urandom.&lt;/p&gt;
&lt;p&gt;The only time you would want to call /dev/random is when the machine is first booting and entropy has not yet accumulated. Most systems will save off entropy before shutting down. so that some is available when booting. so this is not an issue if you run directly on hardware.&lt;/p&gt;
&lt;p&gt;But, it might be an issue if you don&amp;rsquo;t run directly on hardware. If you are using a &lt;code&gt;container&lt;/code&gt; based solution like Docker or CoreOS. You might start off from an initial image, and so may not be able to save state between reboots. And in a multi-tenant container solution, there is only one shared /dev/random which may block.But the work around in these cases is to seed /dev/random with a userspace solution, either using an &lt;code&gt;entropy server for pollinate&lt;/code&gt;, or a &lt;code&gt;CPU time stamp&lt;/code&gt; counter for haveged. Either way, by the time the JVM starts, the system&amp;rsquo;s entropy pool should already be up to the job.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// NativePRNG is an algorithm name to choose from
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;SecureRandom secureRandom = SecureRandom.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;NativePRNG&amp;#34;&lt;/span&gt;); 
IntStream secureRandomInts = secureRandom.&lt;span style=&#34;color:#bbb&#34;&gt;getInts&lt;/span&gt;(streamSize);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;splittablerandom&#34;&gt;SplittableRandom&lt;/h3&gt;
&lt;p&gt;SplittableRandom is a really interesting class, that was added in the scope of Java 8.&lt;/p&gt;
&lt;p&gt;The differences with a Random class are:&lt;/p&gt;
&lt;p&gt;It passes a &lt;code&gt;Diehard&lt;/code&gt; test, that means it can generate more quality pseudorandom numbers. it’s not thread-safe, but faster than Random and method split creates a new SplittableRandom instance that shares no mutable state with the current instance. It’s useful for parallel streams.
it doesn’t extend a Random class like SecureRandom and ThreadLocalRandom.
Let’s take a look at code examples.&lt;/p&gt;
&lt;p&gt;The most common task is to generate a random number in the range:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SplittableRandom().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;(1, 5)
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Generate an array of random ints in the range:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SplittableRandom().&lt;span style=&#34;color:#bbb&#34;&gt;ints&lt;/span&gt;(5, 1, 10).&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;()
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As you see this class has stream-friendly API. Since Java 10 was added SplittableRandom.nextBytes, so you can use it as well. Java 17 added &lt;code&gt;RandomGenerator&lt;/code&gt; interface and SplittableRandom now extends that as we can see from the Figure.&lt;/p&gt;
&lt;p&gt;Will post another blog post for SplittableRandom and how its used in monte carlo simulation&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 56: Zero length Array and Its use </title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day56/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day56/</id>
    <published>2022-10-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">What is zero length Array and why its in java and how its used</summary>
    <content type="html">&lt;p&gt;Recently from one of my senior colleagues LinkedIn post I learned about zero sized array in java. This raised some curiosity. So in this post I am going to share about the learning and findings i have found about zero length array in java.&lt;/p&gt;
&lt;h4 id=&#34;zero-sized-array&#34;&gt;Zero Sized Array:&lt;/h4&gt;
&lt;p&gt;Not only java but also many other languages have zero sized array. In C its call variable length array as the array can have initialization using zero length. In the struct it can have the size initialized.&lt;/p&gt;
&lt;p&gt;A zero length array is simply an array with nothing in it. It is an advantage to have such an array, especially in Java. So you can return a valid array and guarantee that your length check never fails.&lt;/p&gt;
&lt;p&gt;In Java, an array even of primitive types (i.e. int[]) is still an object. It has a length property. An array in Java can be null and it is easier to return null. But to have a method return a null and then checking it from the method caller is cumbersome.&lt;/p&gt;
&lt;p&gt;Thus a zero length array guarantees non-null returns. Which will also insure the call to &lt;code&gt;array.length&lt;/code&gt; doesnt creates null pointer exception.&lt;/p&gt;
&lt;h4 id=&#34;use-of-zero-sized-array&#34;&gt;Use of Zero Sized Array:&lt;/h4&gt;
&lt;p&gt;There are many uses of zero length array. Few of them are listed below&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;String.getBytes() return&lt;/li&gt;
&lt;li&gt;Calling a method of varargs parameter&lt;/li&gt;
&lt;li&gt;Null object pattern ( Sending a empty object rather than null)&lt;/li&gt;
&lt;li&gt;Empty Array from an empty  list&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;stringgetbytes-return&#34;&gt;String.getBytes() return:&lt;/h5&gt;
&lt;p&gt;When calling getBytes() which will return a &lt;code&gt;byte[]&lt;/code&gt; on empty string &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; what should be it&amp;rsquo;s output? It will return a zero sized byte array.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;((&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;(StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;)).&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;calling-a-method-of-vargargs-parameter&#34;&gt;Calling a method of vargargs parameter:&lt;/h5&gt;
&lt;p&gt;When calling a method who have a varargs parameter if we dont provide the varargs parameter with any value what will happen? It will still work. In this case the compiler is implicitly passing a zero sized array. For example the method is&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;printer&lt;/span&gt;(String s1, String ... s2) {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(s1);
        Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(s2).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and when calling the caller is passing a single argument.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        printer(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;);
        printer(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[0]); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// here passing the new String[0] will show a redundant warning
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;null-object-pattern&#34;&gt;Null Object Pattern:&lt;/h5&gt;
&lt;p&gt;Instead of using a null reference to convey absence of an object (for instance, a non-existent file), one uses an object which implements the expected interface, but whose method body is empty. The advantage of this approach over a working default implementation is that a null object is very predictable and has no side effects: it does nothing.&lt;/p&gt;
&lt;p&gt;For example, a function may retrieve a list of files in a folder and perform some action on each. In the case of an empty folder, one response may be to throw an exception or return a null reference rather than a list. Thus, the code which expects a list must verify that it in fact has one before continuing, which can complicate the design.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; File[] &lt;span style=&#34;color:#447fcf&#34;&gt;getFileNames&lt;/span&gt;(String path) {
        File folder = Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(path).&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; folder.&lt;span style=&#34;color:#bbb&#34;&gt;listFiles&lt;/span&gt;() == &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt; ? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; File[0] : folder.&lt;span style=&#34;color:#bbb&#34;&gt;listFiles&lt;/span&gt;();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;when executed from main&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Replacement of nulls
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        File[] files = getFileNames(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhassan/Downloads&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(files.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;empty-array-from-empty-list&#34;&gt;Empty array from empty list:&lt;/h5&gt;
&lt;p&gt;Converting an empty array from empty list one can do it using &lt;code&gt;List.toArray()&lt;/code&gt; which will take the element of the list and create an array with those element. But if the list is empty then? By passing an zero sized array with type will convert it to a zero sized array or empty array of that type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;List&amp;lt;String&amp;gt; list = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
String [] array =  list.&lt;span style=&#34;color:#bbb&#34;&gt;toArray&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[0]); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//passing type information without it needed to cast
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Blue-Green Deployment using DNS</title>
    <link href="https://mohibulsblog.netlify.app/posts/tutorial/devops/blue-green-release-dns/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/tutorial/devops/blue-green-release-dns/</id>
    <published>2022-10-03T00:00:00Z</published>
    <updated>2022-10-20T04:26:58Z</updated>
    <summary type="html">Blue-Green Deployment using DNS to reduce downtime of production application</summary>
    <content type="html">&lt;h4 id=&#34;tldr-too-long-didnt-read&#34;&gt;TLDR (Too Long Didn&amp;rsquo;t Read)&lt;/h4&gt;
&lt;p&gt;Blue-green deployments is a process to minimizing risk and downtime of software releases. DNS based enviorment switching is one of the way. There are many variations of this process but it is important to keep the process simple.&lt;/p&gt;
&lt;h3 id=&#34;blue-green-deployment&#34;&gt;Blue-green deployment&lt;/h3&gt;
&lt;p&gt;First we need to understand what blue-green means. Blue-green deployment is the process of creating more than one production environment so that you can set up a new version before cutting over to it.&lt;/p&gt;
&lt;p&gt;Blue/green deployments provide releases with near zero-downtime and rollback capabilities. Main idea behind blue/green deployment is to move traffic between two identical env. Which are running different versions of the application.&lt;/p&gt;
&lt;p&gt;The blue environment represents the current application version serving production traffic. In parallel, the green environment is running a different version of the application. After the green env is ready and tested, production traffic is then redirected from blue to green. If any problems are found, you can roll back by reverting traffic back to the blue environment.&lt;/p&gt;
&lt;h3 id=&#34;pros-and-cons-of-bluegreen-deployment&#34;&gt;Pro&amp;rsquo;s and Con&amp;rsquo;s of Blue/Green Deployment:&lt;/h3&gt;
&lt;h4 id=&#34;in-place-application-upgradation&#34;&gt;In place application upgradation:&lt;/h4&gt;
&lt;p&gt;Traditional deployments which upgrades the application in place makes it hard to validate your new application version in a production deployment while continuing to run the earlier version of the application.&lt;/p&gt;
&lt;h4 id=&#34;isolated-environments&#34;&gt;Isolated Environments:&lt;/h4&gt;
&lt;p&gt;Blue/green deployments provide a level of isolation between your blue and green application environments. This helps ensure spinning up a parallel green environment which does not affect resources underpinning your blue environment. This isolation reduces your deployment risk.&lt;/p&gt;
&lt;h4 id=&#34;canary-testing-and-release&#34;&gt;Canary Testing and release:&lt;/h4&gt;
&lt;p&gt;After you deploy the green environment, you have the opportunity to validate it. You might do that with test traffic before sending production traffic to the green environment. Also you can use a very small fraction of production traffic, to better reflect real user traffic. This is called &lt;em&gt;canary analysis&lt;/em&gt; or &lt;em&gt;canary testing&lt;/em&gt;. If you discover the green environment is not operating as expected, there is no impact on the blue environment. You can route traffic back to it, minimizing impaired operation or downtime and limiting the blast radius of impact.&lt;/p&gt;
&lt;h4 id=&#34;rollback-capabilities&#34;&gt;Rollback capabilities:&lt;/h4&gt;
&lt;p&gt;This ability to simply roll traffic back to the existing production environment is a key benefit of blue/green deployments. You can roll back to the blue environment at any time during the deployment process. Impaired operation or downtime is minimized because impact is limited to the window of time between green environment issue detection and shift of traffic back to the blue environment. Additionally, impact is limited to the subset of traffic going to the green environment, not all traffic. If the blast radius of deployment errors is reduced, so is the deployment risk.&lt;/p&gt;
&lt;h3 id=&#34;what-is-dns&#34;&gt;What is DNS&lt;/h3&gt;
&lt;p&gt;The Domain Name System (DNS) is the phonebook of the Internet. DNS translates human readable domain names (for example, &lt;a href=&#34;http://www.amazon.com&#34;&gt;www.amazon.com&lt;/a&gt;) to machine readable IP addresses (for example, 192.0.2.44) .&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1666160051/images-from-blog/Feo0RvAXEAIpBmK_flbann.jpg&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Fig: DNS Query Explained&lt;/p&gt;
&lt;p&gt;All computers on the Internet, from your smart phone or laptop to the servers that serve content for massive retail websites find and communicate with one another by using numbers. These numbers are known as &lt;strong&gt;IP addresses&lt;/strong&gt;. When you open a web browser and go to a website, you don&amp;rsquo;t have to remember and enter a long number. Instead, you can enter a &lt;strong&gt;domain name&lt;/strong&gt; like example.com and still end up in the right place.&lt;/p&gt;
&lt;h3 id=&#34;what-is-cname-and-a-record&#34;&gt;What is CNAME and A record&lt;/h3&gt;
&lt;p&gt;So to understand what is CNAME and A record we first need to understand what is a DNS record. DNS records (aka zone files) are instructions that live in authoritative DNS servers . Authoritative servers provide information about a domain. Including what IP address associates with that domain and how to handle requests for that domain. These records consist of a series of text files written in what is known as DNS syntax. DNS syntax is a string of characters used as commands that tell the DNS server what to do. All DNS records also have a ‘TTL’, which stands for time-to-live. This indicates how often a DNS server will refresh that record.&lt;/p&gt;
&lt;p&gt;Two of the most common DNS records are &lt;code&gt;CNAME&lt;/code&gt; and &lt;code&gt;A&lt;/code&gt; record.&lt;/p&gt;
&lt;h4 id=&#34;a-&#34;&gt;A :&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;A&lt;/code&gt; stands for &amp;ldquo;address&amp;rdquo; and this is the most fundamental type of DNS record: it indicates the IP address of a given domain.&lt;/p&gt;
&lt;p&gt;A records only hold IPv4 addresses. If a website has an IPv6 address, it will instead use an &amp;ldquo;AAAA&amp;rdquo; record.&lt;/p&gt;
&lt;p&gt;Here is an example of an A record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;example.com&lt;/th&gt;
&lt;th&gt;record type&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;192.0.2.1&lt;/td&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &amp;ldquo;@&amp;rdquo; symbol in this example indicates that this is a record for the root domain, and the &amp;ldquo;14400&amp;rdquo; value is the TTL (time to live), listed in seconds. The default TTL for A records is 14,400 seconds. This means that if an A record gets updated, it takes 240 minutes (14,400 seconds) to take effect.&lt;/p&gt;
&lt;p&gt;The vast majority of websites only have one A record, but it is possible to have several. Some higher profile websites will have several different A records as part of a technique called round robin load balancing. Which can distribute request traffic to one of several IP addresses, each hosting identical content.&lt;/p&gt;
&lt;h4 id=&#34;cname&#34;&gt;CNAME:&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;canonical name&lt;/code&gt; (CNAME) record is used in lieu of an A record, when a domain or subdomain is an alias of another domain. All CNAME records must point to a domain, never to an IP address. Imagine a game where each level points to another level of game. So final level points to the game boss. A domain with a CNAME record is like a level that can point you to another level (another domain with a CNAME record) or to the boss (a domain with an A record).&lt;/p&gt;
&lt;p&gt;For example, suppose blog.example.com has a CNAME record with a value of ‘example.com’ (without the ‘blog’). This means when a DNS server hits the DNS records for blog.example.com, it actually triggers another DNS lookup to example.com. It returns example.com’s IP address via its A record. In this case we would say that example.com is the canonical name (or true name) of blog.example.com.&lt;/p&gt;
&lt;p&gt;Sometimes, when sites have subdomains such as blog.example.com or shop.example.com, those subdomains will have CNAME records. Those CNAME point to a root domain (example.com). This way if the IP address of the host changes, only the DNS A record for the root domain needs to be updated. So all the CNAME records will follow along with whatever changes are made to the root.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;green.example.com&lt;/th&gt;
&lt;th&gt;record type&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;CNAME&lt;/td&gt;
&lt;td&gt;example.com&lt;/td&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;deployment-structure&#34;&gt;Deployment structure&lt;/h3&gt;
&lt;p&gt;For test purpose we are going to do blue green deployment using docker containers. Here we will create 3 containers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GUI DNS server application&lt;/li&gt;
&lt;li&gt;Blue deployment&lt;/li&gt;
&lt;li&gt;Green Deployment&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;GUI DNS application will help us to write DNS query. But we can easily use a cmd application which can be automated through docker compose for easier blue-green switching.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://res.cloudinary.com/dlsxyts6o/image/upload/v1666002261/images-from-blog/Untitled_Diagram.drawio_fnp9cp.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;So the total Blue Green deployment process will be something like this&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy a version of our application in a container (Blue) using &lt;code&gt;A&lt;/code&gt; Record&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;CNAME&lt;/code&gt; record for our application in this case Blue container&lt;/li&gt;
&lt;li&gt;Deploy the new version of our application in a container (Green) using &lt;code&gt;A&lt;/code&gt; record&lt;/li&gt;
&lt;li&gt;Do testing and regression on green deployment&lt;/li&gt;
&lt;li&gt;Point our &lt;code&gt;CNAME&lt;/code&gt; record to new &lt;code&gt;A&lt;/code&gt; (green container) record&lt;/li&gt;
&lt;li&gt;Destroy the blue container&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;deploy-a-version-of-our-application-in-a-container-blue-using-a-record&#34;&gt;Deploy a version of our application in a container (Blue) using &lt;code&gt;A&lt;/code&gt; Record&lt;/h4&gt;
&lt;p&gt;In order to make use of blue-green deployment via DNS we first need to deploy a running version of our software. We can deploy a single container or many and create a DNS Record pointing their IP addresses. This will let us access our service without needing to know the container IP addresses.&lt;/p&gt;
&lt;h4 id=&#34;create-a-cname-record-for-our-application-in-this-case-blue-container&#34;&gt;Create a &lt;code&gt;CNAME&lt;/code&gt; record for our application in this case Blue container&lt;/h4&gt;
&lt;p&gt;The next DNS record we need to create is a CNAME. A CNAME is an alias from one hostname to another. This means it can be used for redirects or to provide many names for a single service. We should provision a CNAME that our customers use for accessing our service. So that can we have control of the routing.&lt;/p&gt;
&lt;p&gt;Here is an example of what the initial CNAME and A record might look like:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CNAME&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;app.mohibul.com&lt;/td&gt;
&lt;td&gt;blue-app.mohibul.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Where &lt;code&gt;blue-webapp.mohibulsblog.com&lt;/code&gt; is an &lt;code&gt;A&lt;/code&gt; record of something like&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;blue-app.mohibul.com&lt;/th&gt;
&lt;th&gt;record type&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;192.0.2.1&lt;/td&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;deploy-the-new-version-of-our-application-in-a-container-green-using-a-record&#34;&gt;Deploy the new version of our application in a container (Green) using &lt;code&gt;A&lt;/code&gt; record&lt;/h4&gt;
&lt;p&gt;After our system is running and users are using the &lt;code&gt;CNAME&lt;/code&gt; for accessing our service. we can deploy a new version of the software. It can be deployed right next to our current version. once deployed we should be able to access it via its own A record.&lt;/p&gt;
&lt;p&gt;In this phase the green deployment is completed and we can proceed to change the dns records to do blue-green deployment. In this phase we assign the new container&amp;rsquo;s ip an &lt;code&gt;A&lt;/code&gt; record.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;green-app.mohibul.com&lt;/th&gt;
&lt;th&gt;record type&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;192.0.2.5&lt;/td&gt;
&lt;td&gt;3600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;do-testing-and-regression-on-green-deployment&#34;&gt;Do testing and regression on green deployment&lt;/h4&gt;
&lt;p&gt;After deployment we can do integration, functional and regression testing on the application to gain confidence whethere its working properly. If we run test on production data then we need to be very careful. Otherwise if there is dummy data to run those test and see functionaly then its ok to do.&lt;/p&gt;
&lt;h4 id=&#34;point-our-cname-record-to-new-a-green-container-record&#34;&gt;Point our &lt;code&gt;CNAME&lt;/code&gt; record to new &lt;code&gt;A&lt;/code&gt; (green container) record&lt;/h4&gt;
&lt;p&gt;To change and point users to the new  application version. we need to update our CNAME record to point at the new A record. This should be quick but depending on the time to live (TTL) of the DNS record may take some time to propagate. since DNS is cached in multiple places based on the TTL provided.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CNAME&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;app.mohibul.com&lt;/td&gt;
&lt;td&gt;green-app.mohibul.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;destroy-the-blue-container&#34;&gt;Destroy the blue container&lt;/h4&gt;
&lt;p&gt;After successful deployment and switching we can safely destroy the previous environment by deleting it or uninstalling any software that is left running. This can happen immediately or after some time but should be done as needed based on specific requirements.&lt;/p&gt;
&lt;p&gt;In my next blog post will show a demo by running these containers and switching&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 55: Understanding static and instance initializer in java classes and</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day55/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day55/</id>
    <published>2022-09-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding java classe&amp;rsquo;s static and instance initializer</summary>
    <content type="html">&lt;h2 id=&#34;static-initializer-block&#34;&gt;&lt;strong&gt;Static&lt;/strong&gt; initializer &lt;strong&gt;Block&lt;/strong&gt;&lt;/h2&gt;
&lt;h2 id=&#34;heading&#34;&gt;&lt;/h2&gt;
&lt;p&gt;In Java, &lt;strong&gt;a static initializer block executes code before the object instance initialization&lt;/strong&gt;. A static block is a block of code with a &lt;em&gt;static&lt;/em&gt; keyword&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static {
    // definition of the static block
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Static initializer block or static initialization block, or static clause are some other names for the static block. &lt;strong&gt;Static block code executes only once during the class loading&lt;/strong&gt;. The static blocks always &lt;strong&gt;execute first&lt;/strong&gt; before the &lt;strong&gt;_main() _&lt;/strong&gt; in Java because the compiler stores them in memory at the time of class loading and before the object creation.&lt;/p&gt;
&lt;p&gt;A class can have multiple static blocks, and they will execute in the same order as they appear in the class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class Day55 {

    static {
        System.out.println(&amp;quot;block 1&amp;quot;);
    }
    
    static {
        System.out.println(&amp;quot;block 2&amp;quot;);
    }

    public static void main(String[] args) {
        System.out.println(&amp;quot;Main Method&amp;quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;instance-initializer-block&#34;&gt;&lt;strong&gt;Instance Initializer Block&lt;/strong&gt;&lt;/h2&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;&lt;/h2&gt;
&lt;p&gt;As the name suggests, &lt;strong&gt;the purpose of the instance initializer block is to initialize the instance data members.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The instance initializer block looks just like the static initializer block, but without the &lt;em&gt;static&lt;/em&gt; keyword:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
     // definition of the Instance initialization block
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Static initializer blocks always execute before the instance initialization blocks because static blocks run at the time of class loading. However, the instance block runs at the time of instance creation.&lt;/strong&gt; The Java compiler copies initializer blocks into every constructor. Therefore, multiple constructors can use this approach to share a block of code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class Day55 {

    {
        System.out.println(&amp;quot;Instance initializer block 1&amp;quot;);
    }
    
    {
        System.out.println(&amp;quot;Instance initializer block 2&amp;quot;);
    }
    
    public Day55() {
        System.out.println(&amp;quot;Class constructor&amp;quot;);
    }

    public static void main(String[] args) {
        Day55 iib = new Day55();
        System.out.println(&amp;quot;Main Method&amp;quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So now using both to create a &lt;code&gt;DateTimeFormatter&lt;/code&gt; for &lt;code&gt;DateTimeFormatterBuilder()&lt;/code&gt; to get a customized &lt;code&gt;DateTimeFormatter&lt;/code&gt; intance and initialize it in static block and then use it to calculate today&amp;rsquo;s date in the instance initializer block and printing todays date just by creating an instance of the class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day56&lt;/span&gt; {


    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; DateTimeFormatter DATE_TIME_FORMATTER;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Day55 instance;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String today;

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// static initializer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; {
        DATE_TIME_FORMATTER = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; DateTimeFormatterBuilder()
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendLiteral&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Day value -&amp;gt; &amp;#34;&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendValue&lt;/span&gt;(ChronoField.&lt;span style=&#34;color:#bbb&#34;&gt;DAY_OF_MONTH&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendLiteral&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; Month value -&amp;gt; &amp;#34;&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendValue&lt;/span&gt;(ChronoField.&lt;span style=&#34;color:#bbb&#34;&gt;MONTH_OF_YEAR&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendLiteral&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; Year value -&amp;gt; &amp;#34;&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;appendValue&lt;/span&gt;(ChronoField.&lt;span style=&#34;color:#bbb&#34;&gt;YEAR&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;toFormatter&lt;/span&gt;();
        instance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Day55();

    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Instance Initializer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    {
        today = DATE_TIME_FORMATTER.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(LocalDateTime.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;());

    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Day55 &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now the main method&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Day55 day55FromStaticInitialization = Day55.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(day55FromStaticInitialization.&lt;span style=&#34;color:#bbb&#34;&gt;today&lt;/span&gt;);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;By initializing the instance as static and then making the class as Singleton to get already initialized instance when classloader loaded the classes&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Git troubleshooting : 6 helpful command with explanations</title>
    <link href="https://mohibulsblog.netlify.app/posts/tutorial/git/git-troubleshooting-with-helpful-commands/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/tutorial/git/git-troubleshooting-with-helpful-commands/</id>
    <published>2022-09-15T00:00:00Z</published>
    <updated>2022-09-21T08:10:05Z</updated>
    <summary type="html">Git troubleshooting with helpful commands to revert, stash, split, recover commits</summary>
    <content type="html">&lt;p&gt;While commiting in git we sometimes face some issues after commiting or pushing commits to remote repository. Some of the common scenairos are like&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Commit needs to be reverted before push&lt;/li&gt;
&lt;li&gt;Commit needs to be reverted after push&lt;/li&gt;
&lt;li&gt;Switch branch and save current uncommited work&lt;/li&gt;
&lt;li&gt;Splitting a large commit into smaller understandable commit&lt;/li&gt;
&lt;li&gt;Recovering lost file&lt;/li&gt;
&lt;li&gt;Commit in the wrong branch&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In these above mentioned case we can do something to fix.&lt;/p&gt;
&lt;h3 id=&#34;commit-needs-to-be-reverted-before-push&#34;&gt;Commit needs to be reverted before push&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;To only undo the last commit command but keep the work&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt; git reset --soft HEAD~1
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Or, revert your work and undo the last commit as well&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git reset --hard HEAD~1
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;commit-needs-to-be-reverted-after-push&#34;&gt;Commit needs to be reverted after push&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;To undo the last commit which is already pushed on the remote branch&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git revert HEAD~1
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;To undo any commit pass the commit hash id&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git revert &amp;lt;commit-hash-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;switch-branch-and-save-current-uncommited-work&#34;&gt;Switch branch and save current uncommited work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;To only stash a selected file&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git stash push -m &amp;quot;stash-message&amp;quot; &amp;lt;file-path&amp;gt; - &amp;quot;-m stash-message&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; &lt;/p&gt;
&lt;p&gt;here the message is optional in the above command, it stands for message and adds more description to your stash&lt;/p&gt;
&lt;h3 id=&#34;splitting-a-large-commit-into-smaller-understandable-commit&#34;&gt;Splitting a large commit into smaller understandable commit&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If by mistake you added all files in a single commit and want to split into multiple commits then use:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git rebase HEAD~
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, as usual, choose each file and commit them individually
 &lt;/p&gt;
&lt;h3 id=&#34;recover-lost-file&#34;&gt;Recover lost file&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;To recover any accidentally deleted files&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git restore -- &amp;lt;file-path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will also get you those files which are even removed from recycle bin
 &lt;/p&gt;
&lt;h3 id=&#34;commit-in-the-wrong-branch&#34;&gt;Commit in the wrong branch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Suppose you committed last two commits in &amp;ldquo;master&amp;rdquo; instead of &amp;ldquo;feature&amp;rdquo; branch&lt;/li&gt;
&lt;li&gt;Perform the following series of commands (currently you&amp;rsquo;re on master)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&#34;language-git&#34; data-lang=&#34;git&#34;&gt;git stash
git checkout feature
git stash pop
&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Day 54: Understanding volatile keyword&#39;s use for Multi Threaded program</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day54/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day54/</id>
    <published>2022-09-01T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understanding volatile keyword&amp;rsquo;s use in incrementing a double variable and see how it behaves in multi threaded env</summary>
    <content type="html">&lt;p&gt;Processors execute program instructions. So, they need to retrieve both the program instructions and required data from RAM.As CPU&amp;rsquo;s are capable of carrying out a significant number of instructions per second (IOPS), fetching from RAM isn&amp;rsquo;t that ideal for them. As its an expensive call. So to mitigate this issue there are some techniques and &lt;code&gt;caching&lt;/code&gt; is one of them.&lt;/p&gt;
&lt;p&gt;Here in the below diagram we can see that each core of a processor have two level cache (L1, L2) and in L1 there is both &lt;code&gt;Data&lt;/code&gt; and &lt;code&gt;Instruction&lt;/code&gt; cache. Where the data and instructions are copied for processing. As different cores execute more instructions and manipulate more data, they fill up their caches with more relevant data and instructions.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.baeldung.com/wp-content/uploads/2017/08/cpu.png&#34; alt=&#34;cpu&#34;  title=&#34;Cpu Cache&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Source: Baeldung&lt;/p&gt;
&lt;p&gt;Simply it would be best to think about what would happen if a thread changes a cached value and at the same time other thread trying to read it&lt;/p&gt;
&lt;h3 id=&#34;what-is-volatile&#34;&gt;What is Volatile&lt;/h3&gt;
&lt;p&gt;First for understanding &lt;code&gt;volatile&lt;/code&gt; lets understand what is non-volatile varialbe. Non volatile variables have no particular guarantee when JVM  will read data from the main memory into cpu caches or when will cpu caches writes those data in main memory. This particular issue can cause lots of issues.&lt;/p&gt;
&lt;p&gt;Simplest example would be something like incrementing a number.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SharedClass&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; mutableNumber = 999990;

}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;Thread 1&lt;/code&gt; increments the &lt;code&gt;mutableNumber&lt;/code&gt; variable, but both &lt;code&gt;Thread 1&lt;/code&gt; and &lt;code&gt;Thread 2&lt;/code&gt; may read the mutableNumber variable.&lt;/p&gt;
&lt;p&gt;In this case mutableNumber variable is not declared volatile so there is no guarantee about when the value of the counter variable is written from the CPU cache back to main memory. This means, that the mutableNumber variable value in the CPU cache may not be the same as in main memory.&lt;/p&gt;
&lt;p&gt;Its not guaranteed when cpu cache will write to memory or vice versa no thread is sure about the state of mutableNumber. Thus having a visibility issue. This is called &lt;a href=&#34;https://wiki.sei.cmu.edu/confluence/display/java/Concurrency%2C+Visibility%2C+and+Memory&#34;&gt;Visibility Problem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Java &lt;strong&gt;volatile&lt;/strong&gt; keyword is intended to address variable visibility problems. By declaring the mutableNumber variable volatile, all writes to the mutableNumber variable will be written back to main memory immediately. Also, all reads of the mutableNumber variable will be read directly from main memory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SharedClass&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; mutableNumber = 999990;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Declaring a variable volatile thus guarantees the visibility for other threads of writes to that variable.&lt;/p&gt;
&lt;p&gt;In the scenario given above, where &lt;code&gt;Thread 1&lt;/code&gt; modifies the value, and another &lt;code&gt;Thread 2&lt;/code&gt; reads the value &lt;strong&gt;(but never modifies it)&lt;/strong&gt;, declaring the mutableNumber variable volatile is enough to guarantee visibility for Thread 2 of writes to the variable.&lt;/p&gt;
&lt;h3 id=&#34;where-volatile-is-not-enough&#34;&gt;Where Volatile is Not Enough:&lt;/h3&gt;
&lt;p&gt;If, however, both &lt;code&gt;Thread 1&lt;/code&gt; and &lt;code&gt;Thread 2&lt;/code&gt; were incrementing the variable, then declaring the variable volatile would not have been enough.&lt;/p&gt;
&lt;p&gt;In a recent comment of mine on this &lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:activity:6965702117483307008/?commentUrn=urn%3Ali%3Acomment%3A(activity%3A6965702117483307008%2C6972607832986644480)&amp;amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A(6972607832986644480%2Curn%3Ali%3Aactivity%3A6965702117483307008)&#34;&gt;question&lt;/a&gt; made in linkedin answered the question and now will try to expand on that. In the comment i have mentioned increment operation is not thread safe. As a simple &lt;code&gt;mutableNumber++&lt;/code&gt; is broken into 3 steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reading the current value from memory&lt;/li&gt;
&lt;li&gt;Update the value by adding 1 with it&lt;/li&gt;
&lt;li&gt;Write the value in memory&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So while doing these operations threads context can switch and can cause issues for the thread who is trying to read the value while it wasnt fully committed yet in the memory by another thread. In this case the operations needs to be &lt;code&gt;Atomic&lt;/code&gt; or the incrementing operation be behind a lock.&lt;/p&gt;
&lt;h3 id=&#34;atomicity&#34;&gt;Atomicity&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Atom&lt;/strong&gt; comes from greek &lt;code&gt;atomos&lt;/code&gt; = &lt;code&gt;uncuttable&lt;/code&gt;, and has been used in the sense &lt;code&gt;indivisible smallest unit&lt;/code&gt;. In concurrent programming, it means that &lt;strong&gt;there will be no context switch during it - nothing can affect the execution of atomic command.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On a single-processor machine, that&amp;rsquo;s a stronger guarantee than you need. On a multi-processor machine, it isn&amp;rsquo;t strong enough. &lt;strong&gt;What atomic really means is, no other thread will be able to see the operation in a partially-completed state&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now to achieve the solution of the above mentione problem we can you solutions&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using synchronize&lt;/li&gt;
&lt;li&gt;Using AtomicLong and convert the double value to long and viceversa&lt;/li&gt;
&lt;li&gt;Using AtomicFieldUpdater (Field Updater classes can be used to perform atomic operation on a selected volatile field of a selected class.&lt;br&gt;
&lt;code&gt;AtomicReferenceFieldUpdater&lt;/code&gt;, &lt;code&gt;AtomicIntegerFieldUpdater&lt;/code&gt;, and &lt;code&gt;AtomicLongFieldUpdater&lt;/code&gt; are reflection-based utilities that provide access to the associated field types)&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Day 53: Processing Http Request Asynchronously using CompletableFutures</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day53/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day53/</id>
    <published>2022-08-17T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using CompletableFuture&amp;rsquo;s execution to process http request asynchronously</summary>
    <content type="html">&lt;p&gt;Java HttpClient can send asynchronous request using &lt;code&gt;HttpClient.sendAsync()&lt;/code&gt; which returns a &lt;code&gt;CompletableFuture&amp;lt;HttpResponse&amp;lt;T&amp;gt;&amp;gt;&lt;/code&gt;. By collecting all the request and then executing them with with a stream to get list of &lt;code&gt;HttpResponse&amp;lt;T&amp;gt;&lt;/code&gt; and partition the result with status code.&lt;/p&gt;
&lt;h3 id=&#34;completablefuture&#34;&gt;CompletableFuture:&lt;/h3&gt;
&lt;p&gt;The Future interface was added in Java 5 to serve as a result of an asynchronous computation, but it did not have any methods to combine computations or handle possible errors.&lt;/p&gt;
&lt;p&gt;Java 8 introduced the CompletableFuture class. Along with the &lt;code&gt;Future&lt;/code&gt; interface, it also implemented the &lt;code&gt;CompletionStage&lt;/code&gt; interface. This interface defines the contract for an asynchronous computation step that we can combine with other steps.&lt;/p&gt;
&lt;p&gt;CompletableFuture is used for composing, combining, and executing asynchronous computation steps and handling errors.&lt;/p&gt;
&lt;h3 id=&#34;httpclientsendasync&#34;&gt;HttpClient.sendAsync():&lt;/h3&gt;
&lt;p&gt;Sends the given request asynchronously using this client with the given response body handler. This returns a CompletableFuture of HttpResponse.&lt;/p&gt;
&lt;p&gt;Now by sending http request from http client asynchronously we get all the CompletableFuture&amp;rsquo;s in a list and then process the list. Partitioning the list by HTTP code 200. That means if the GET request completes successfully the returned Map&amp;rsquo;s &lt;code&gt;map.get(true)&lt;/code&gt; will list all the successfully executed HttpResponse, and &lt;code&gt;map.get(false)&lt;/code&gt; will return the failed get request which didn&amp;rsquo;t returend HTTP 200.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Map&amp;lt;Boolean,List&amp;lt;HttpResponse&amp;lt;String&amp;gt;&amp;gt;&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;httpRequestDispatcher&lt;/span&gt;(List&amp;lt;HttpRequest&amp;gt; requests) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; URISyntaxException {

        HttpClient httpClient = HttpClient
                .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;connectTimeout&lt;/span&gt;(Duration.&lt;span style=&#34;color:#bbb&#34;&gt;ofMinutes&lt;/span&gt;(2))
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

          List&amp;lt;CompletableFuture&amp;lt;HttpResponse&amp;lt;String&amp;gt;&amp;gt;&amp;gt; list  = requests
                .&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(request -&amp;gt; httpClient.&lt;span style=&#34;color:#bbb&#34;&gt;sendAsync&lt;/span&gt;(request, HttpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;BodyHandlers&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ofString&lt;/span&gt;()))
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(future -&amp;gt; future.&lt;span style=&#34;color:#bbb&#34;&gt;thenApplyAsync&lt;/span&gt;(response -&amp;gt; {
                    System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread &amp;#34;&lt;/span&gt; + Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; current time &amp;#34;&lt;/span&gt; + System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;());
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; response;
                })).&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; list.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(future -&amp;gt; future.&lt;span style=&#34;color:#bbb&#34;&gt;exceptionally&lt;/span&gt;(throwable -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;))
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(CompletableFuture::join)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;partitioningBy&lt;/span&gt;(httpResponse -&amp;gt; httpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;statusCode&lt;/span&gt;() == 200));
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After getting the map and extracting the list out of it we can check HttpResponse.body for the response. For this instance its a String output for chuck norris api&amp;rsquo;s joke.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day53&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; URISyntaxException, ExecutionException, InterruptedException {
        String apiURL = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.chucknorris.io/jokes/random&amp;#34;&lt;/span&gt;;
        String method = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;;

        List&amp;lt;HttpRequest&amp;gt; httpRequests = getHttpRequests(apiURL,3);

        HttpClient httpClient = HttpClient
                .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;connectTimeout&lt;/span&gt;(Duration.&lt;span style=&#34;color:#bbb&#34;&gt;ofMinutes&lt;/span&gt;(2))
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
                
                Map&amp;lt;Boolean, List&amp;lt;HttpResponse&amp;lt;String&amp;gt;&amp;gt;&amp;gt; result =  httpRequestDispatcher(httpRequests);

          List&amp;lt;HttpResponse&amp;lt;String&amp;gt;&amp;gt; success = result.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;);
          List&amp;lt;HttpResponse&amp;lt;String&amp;gt;&amp;gt; failed = result.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);

          System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Success&amp;#34;&lt;/span&gt;);
          success.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(httpResponse -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;body&lt;/span&gt;()));

          System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;);
          failed.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(httpResponse -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;body&lt;/span&gt;()));
   }
   
   
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;HttpRequest&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getHttpRequests&lt;/span&gt;(String url, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; requestInstances) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0,requestInstances).&lt;span style=&#34;color:#bbb&#34;&gt;mapToObj&lt;/span&gt;(value -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; HttpRequest
                            .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                            .&lt;span style=&#34;color:#bbb&#34;&gt;uri&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URI(url))
                            .&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;()
                            .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (URISyntaxException e) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e);
                }
            }).&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After getting all the requests sorted into success and failed list we can check out the body of the requests for the joke and the error response the API returns.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 52: Async Processing HttpRequest&#39;s using ExecutorCompletionService</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day52/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day52/</id>
    <published>2022-07-26T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Async Processing HttpRequest&amp;rsquo;s using ExecutorCompletionService</summary>
    <content type="html">&lt;h3 id=&#34;what-is-synchronous-and-asynchronous&#34;&gt;What is Synchronous and Asynchronous:&lt;/h3&gt;
&lt;p&gt;Java code executes line by line.&amp;quot;&lt;strong&gt;Synchronously&amp;quot;&lt;/strong&gt; means &amp;ldquo;using the same clock&amp;rdquo; so when two instructions are synchronous they use the same clock and must happen one after the other. &amp;ldquo;Asynchronous&amp;rdquo; means &amp;ldquo;not using the same clock&amp;rdquo; so the instructions are not concerned with being in step with each other. That&amp;rsquo;s why it looks backwards, the term is not referring to the instructions relationship to each other. It&amp;rsquo;s referring to each instructions relationship to the clock&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.koyeb.com/static/images/blog/sync-vs-async-schema.png&#34; alt=&#34;Koyeb - Introduction to Synchronous and Asynchronous Processing&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;There are a couple of ways in which you can make asynchronous calls in Java depending upon your requirement. (But controlling them well is extremely important and tricky at times.)&lt;/p&gt;
&lt;p&gt;In addition to &lt;code&gt;Runnable&lt;/code&gt; interface (which is used to just execute tasks but doesn&amp;rsquo;t return anything to caller) ,you can read about &lt;code&gt;Callable&lt;/code&gt; interface and Future objects in java. (Which can return data to the caller)&lt;/p&gt;
&lt;h3 id=&#34;completionservice&#34;&gt;CompletionService:&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;CompletionService&lt;/code&gt; can be used to manage asynchronous IO, in which tasks that perform reads are submitted in one part of a program or system, and then acted upon in a different part of the program when the reads complete, possibly in a different order than they were requested(in the order of completion).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CompletionService manages an internal completion queue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let’s understand in layman language.&lt;/p&gt;
&lt;p&gt;Suppose you want to execute n number of tasks in parallel, you will think of using threads, now how will you manage all threads execution? okay one may say with the help of &lt;strong&gt;Executor Service&lt;/strong&gt; we can handle those threads. &lt;strong&gt;Completion service also solves the same thing for you but gives you an advantage when tasks are completed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With ExecutorService, once you have submitted the tasks to run, you need to manually code for efficiently getting the results of the tasks completed.&lt;/p&gt;
&lt;p&gt;With CompletionService, this is pretty much automated. Imagine you have a list of tasks to be subdraftmitted. Then, instead of trying to find out which task has completed (to get the results), it just asks the CompletionService instance to return the results as they become available.&lt;/p&gt;
&lt;p&gt;Completion service provides functions to get completed tasks from its internal queue in the order they have completed.&lt;/p&gt;
&lt;h3 id=&#34;executorcompletionservice&#34;&gt;ExecutorCompletionService:&lt;/h3&gt;
&lt;p&gt;A CompletionService that &lt;strong&gt;uses a supplied Executor&lt;/strong&gt; to execute tasks. This class arranges that submitted tasks are, upon completion, placed on a queue accessible using take. The class is lightweight enough to be suitable for transient use when processing groups of tasks.&lt;/p&gt;
&lt;p&gt;Using a &lt;code&gt;ExecutorCompletionService&lt;/code&gt; to call http get requests to a jokes api to get response concurrently and completes each request as it completes and then we poll from the service to take the outputs of the get request.&lt;/p&gt;
&lt;p&gt;Firstly creating a custom &lt;code&gt;HttpCallable&lt;/code&gt; class to send, process http get response&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;HttpCallable&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Callable&amp;lt;String&amp;gt; {

        HttpClient httpClient;
        HttpRequest httpRequest;

        HttpCallable(HttpClient httpClient, HttpRequest request) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;httpClient&lt;/span&gt; = httpClient;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;httpRequest&lt;/span&gt; = request;
        }

       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;call&lt;/span&gt;() &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
               &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; httpClient.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(httpRequest, HttpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;BodyHandlers&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ofString&lt;/span&gt;()).&lt;span style=&#34;color:#bbb&#34;&gt;body&lt;/span&gt;()+ &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread &amp;#34;&lt;/span&gt; + Thread.&lt;span style=&#34;color:#bbb&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; current time &amp;#34;&lt;/span&gt; + System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this classes &lt;code&gt;call()&lt;/code&gt; method executes httpclient sendAsync method, which takes HttpRequest object. &lt;code&gt;httpClient.send().body()&lt;/code&gt; returns a string body as the response is handled with BodyHandlers.ofString()&lt;/p&gt;
&lt;p&gt;To create the Http requests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;HttpRequest&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getHttpRequests&lt;/span&gt;(String url, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; requestInstances) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0,requestInstances).&lt;span style=&#34;color:#bbb&#34;&gt;mapToObj&lt;/span&gt;(value -&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; HttpRequest
                            .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                            .&lt;span style=&#34;color:#bbb&#34;&gt;uri&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URI(url))
                            .&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;()
                            .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
                } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (URISyntaxException e) {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e);
                }
            }).&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now to use the callables and submit to ExecutorCompletionService&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;httpDispatcherExecutionCompletion&lt;/span&gt;(HttpClient httpClient, List&amp;lt;HttpRequest&amp;gt; requests) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; ExecutorService pool = Executors.&lt;span style=&#34;color:#bbb&#34;&gt;newFixedThreadPool&lt;/span&gt;(3);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; CompletionService&amp;lt;String&amp;gt; service = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ExecutorCompletionService&amp;lt;&amp;gt;(pool);


        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;? &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; Callable&amp;lt;String&amp;gt;&amp;gt; callables = requests.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(request -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HttpCallable(httpClient,request)).&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Callable&amp;lt;String&amp;gt; callable : callables) {
            service.&lt;span style=&#34;color:#bbb&#34;&gt;submit&lt;/span&gt;(callable);
        }
        pool.&lt;span style=&#34;color:#bbb&#34;&gt;shutdown&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (!pool.&lt;span style=&#34;color:#bbb&#34;&gt;isTerminated&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Future&amp;lt;String&amp;gt; future = service.&lt;span style=&#34;color:#bbb&#34;&gt;take&lt;/span&gt;();
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(future.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;());
            }
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (ExecutionException | InterruptedException ex) { }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;to process the request&amp;rsquo;s first create a &lt;code&gt;ExecutorService&lt;/code&gt;. Passing that pool to &lt;code&gt;ExecutorCompletionService&lt;/code&gt;. Then taking each Callables and submitting them to the ExecutorCompletionService to process. As the pool will terminate after processing all callables I check that and take &lt;code&gt;Future&lt;/code&gt; response from the inner queue of ExecutionCompleitonService and then get the value.&lt;/p&gt;
&lt;p&gt;Now to connect it all&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day52&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; URISyntaxException, ExecutionException, InterruptedException {
        String apiURL = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.chucknorris.io/jokes/random&amp;#34;&lt;/span&gt;;
        String method = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;;

        List&amp;lt;HttpRequest&amp;gt; httpRequests = getHttpRequests(apiURL,3);

        HttpClient httpClient = HttpClient
                .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//                .executor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()))
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                .&lt;span style=&#34;color:#bbb&#34;&gt;connectTimeout&lt;/span&gt;(Duration.&lt;span style=&#34;color:#bbb&#34;&gt;ofMinutes&lt;/span&gt;(2))
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
                
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;---------------------- ExecutorCompletionService-------------&amp;#34;&lt;/span&gt;);

        httpDispatcherExecutionCompletion(httpClient, httpRequests);
    }
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In the next part will do the exact thing using CompletableFuture and its functionality to asynchronous execution of http get requests.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 51: Creating Stream (using StreamSupport API)  from Spliterator by converting Iterator to Spliterator</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day51/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day51/</id>
    <published>2022-05-28T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Creating Stream using StreamSupport and splitting it using partitioning and grouping</summary>
    <content type="html">&lt;p&gt;Creating a Stream using Java &lt;code&gt;StreamSupport&lt;/code&gt; api and iterator, spliterator and then partition the stream using &lt;code&gt;Collections.partitionBy()&lt;/code&gt; and &lt;code&gt;Collections.groupBy()&lt;/code&gt; method.&lt;/p&gt;
&lt;h3 id=&#34;stream&#34;&gt;Stream:&lt;/h3&gt;
&lt;p&gt;Introduced in Java 8, the &lt;code&gt;Stream&lt;/code&gt; API is used to process collections of objects. A stream is a sequence of objects that supports various methods which can be pipelined to produce the desired result.
The features of Java stream are –&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A stream is not a data structure instead it takes input from the Collections, Arrays or I/O channels.&lt;/li&gt;
&lt;li&gt;Streams don’t change the original data structure, they only provide the result as per the pipelined methods.&lt;/li&gt;
&lt;li&gt;Each intermediate operation is lazily executed and returns a stream as a result, hence various intermediate operations can be pipelined. Terminal operations mark the end of the stream and return the result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make a Stream from &lt;code&gt;Iterator&lt;/code&gt; We first need to make a &lt;code&gt;Spliterator&lt;/code&gt; first. So lets first understand what is &lt;code&gt;Iterator&lt;/code&gt; and &lt;code&gt;Spliterator&lt;/code&gt; is.&lt;/p&gt;
&lt;h4 id=&#34;iterator&#34;&gt;Iterator:&lt;/h4&gt;
&lt;p&gt;A Java Cursor is an Iterator, which is used to iterate or traverse or retrieve a Collection or Stream object’s elements one by one. There are three cursors in Java. &lt;code&gt;Spliterator&lt;/code&gt; is also a special type of &lt;code&gt;Iterator&lt;/code&gt; so its also a cursor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Iterator&lt;/li&gt;
&lt;li&gt;Enumeration&lt;/li&gt;
&lt;li&gt;ListIterator&lt;/li&gt;
&lt;li&gt;Spliterator&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Iterators in Java are used in the Collection framework to retrieve elements one by one lazily. It is a universal iterator as we can apply it to any Collection object. By using Iterator, we can perform both read/update and remove operations. It is an improved version of &lt;code&gt;Enumeration&lt;/code&gt; with the additional functionality of removing an element.&lt;/p&gt;
&lt;p&gt;Iterator must be used whenever we want to enumerate elements in all Collection framework implemented interfaces like &lt;code&gt;Set&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Queue&lt;/code&gt;, &lt;code&gt;Deque&lt;/code&gt;, and all implemented classes of &lt;code&gt;Map&lt;/code&gt; interface.&lt;/p&gt;
&lt;h4 id=&#34;spliterator&#34;&gt;Spliterator:&lt;/h4&gt;
&lt;p&gt;Besides traversing sequences of data, like an &lt;code&gt;Iterator&amp;lt;T&amp;gt;&lt;/code&gt; a &lt;code&gt;Spliterator&amp;lt;T&amp;gt;&lt;/code&gt; can also partition it:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Iterator + Splitting =&amp;gt; Spliterator&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;trySplit()&lt;/code&gt; method allows it to partition off some elements of the sequence as another &lt;code&gt;Spliterator&amp;lt;T&amp;gt;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This particular advantage over Iterator makes it the core component of the Stream API. By splitting up data into apt sub-sequences, it allows parallel processing.&lt;/p&gt;
&lt;h3 id=&#34;iterator-to-spliterator&#34;&gt;Iterator to Spliterator:&lt;/h3&gt;
&lt;p&gt;To convert an Iterator to Spliterator there is two api&amp;rsquo;s. One is for &lt;code&gt;unknownsized&lt;/code&gt; collection and another is for known &lt;code&gt;sized&lt;/code&gt; collections. In the known sized &lt;code&gt;Spliterators.spliterator()&lt;/code&gt; requires the size whereas the unknownsized doesnt required the size.&lt;/p&gt;
&lt;p&gt;There is another parameter that is needed to be provided to the method, and that is &lt;code&gt;characterstics&lt;/code&gt;, which is an integer that defines the characterstics of the spliterator.&lt;/p&gt;
&lt;p&gt;Type of spliterator&amp;rsquo;s&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Empty Spliterator [Spliterators.emptySpliterator();]&lt;/li&gt;
&lt;li&gt;Sized Spliterator [Spliterators.spliterator();]&lt;/li&gt;
&lt;li&gt;Unknownsized Spliterator [Spliterators.spliteratorUnknownSize();]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now creating a unknownsized spliterator from and Iterator&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt; Iterator&amp;lt;Node&amp;gt; nodeIterator = Iterators.&lt;span style=&#34;color:#bbb&#34;&gt;nodes&lt;/span&gt;(result);
Spliterator&amp;lt;Node&amp;gt; nodeSpliterator = Spliterators.&lt;span style=&#34;color:#bbb&#34;&gt;spliteratorUnknownSize&lt;/span&gt;(nodeIterator,Spliterator.&lt;span style=&#34;color:#bbb&#34;&gt;CONCURRENT&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now &lt;code&gt;StreamSupport.stream()&lt;/code&gt; method can take that &lt;code&gt;Spliterator&lt;/code&gt; Object and a boolean option to enable parallel processing of stream elements. This method Creates a new sequential or parallel Stream from a Spliterator.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;Stream&amp;lt;Node&amp;gt; nodeStream = StreamSupport.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(nodeSpliterator,&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The spliterator is only traversed, split, or queried for estimated size after the terminal operation of the stream pipeline commences.&lt;/p&gt;
&lt;p&gt;If parallel option is enabled then the returned stream will be parallel and if false then it will return a sequential stream.&lt;/p&gt;
&lt;p&gt;This is a great &lt;a href=&#34;https://stackoverflow.com/questions/20375176/should-i-always-use-a-parallel-stream-when-possible&#34; title=&#34;Stackoverflow&#34;&gt;stackoverflow&lt;/a&gt; article to understand if we should use parallel everywhere possible?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 50: Marker interface and it&#39;s uses</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day50/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day50/</id>
    <published>2022-05-21T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Marker interface and it&amp;rsquo;s uses</summary>
    <content type="html">&lt;p&gt;At first lets understand what is an Interface in Java&lt;/p&gt;
&lt;h3 id=&#34;interface&#34;&gt;Interface:&lt;/h3&gt;
&lt;p&gt;An Interface in Java programming language is defined as an abstract type used to specify the behavior of a class. An interface in Java is a blueprint of a class. A Java interface contains static constants and abstract methods and from java 8 default implementations.&lt;/p&gt;
&lt;p&gt;The interface in Java is a mechanism to achieve abstraction. There can be abstract methods in the Java interface, and method body for default methods. It is used to achieve abstraction and multiple inheritance in Java. In other words, you can say that interfaces can have abstract methods and variables. Java Interface also represents the IS-A relationship.&lt;/p&gt;
&lt;h3 id=&#34;marker-interface&#34;&gt;Marker Interface:&lt;/h3&gt;
&lt;p&gt;Market Interface is an interface that has no method declarations or fields in it. It is used as a tag to let the compiler know it needs to add some special behavior to the class implementing the marker interface. That is why the marker interface is also known as the tag interface in Java. Some java interfaces have no members like&lt;/p&gt;
&lt;p&gt;&lt;code&gt;java. lang.Cloneable&lt;/code&gt;
&lt;code&gt;java.io.Serializable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;these both interfaces are Marker Interfaces because it has no members. Marker interfaces are used to mark a class for a purpose. Purpose does not require any additional functionality.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Use of Clonable &amp;amp; Serialization Marker interfaces are shown below.&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;for-example&#34;&gt;For Example&lt;/h5&gt;
&lt;p&gt;java.io.Serializable interface is defined into java.io classes&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ObjectInputStream&lt;/code&gt;
&lt;code&gt;ObjectOutputStream&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Marker Interfaces provide runtime information about Object. So the compiler and the JVM have additional information about the Object.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As we can see clonable and serialization implementes marker type interface so lets see example of both&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;clonable&#34;&gt;Clonable:&lt;/h4&gt;
&lt;p&gt;Cloneable interface is implemented by a class to make &lt;code&gt;Object.clone()&lt;/code&gt; method valid thereby making field-for-field copy. This interface allows the implementing class to have its objects to be cloned instead of using a new operator.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Example&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Cloneable {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; number;
    String str;
  
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Example class constructor
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;Example&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i, String s)
    {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;number&lt;/span&gt; = number;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;str&lt;/span&gt; = str;
    }
  
    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Overriding clone() method
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// by simply calling Object class
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// clone() method.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; Object &lt;span style=&#34;color:#447fcf&#34;&gt;clone&lt;/span&gt;()
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; CloneNotSupportedException
    {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();
    }
}
  
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day50&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args)
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; CloneNotSupportedException
    {
        Example anotherExample = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Example(20, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Example&amp;#34;&lt;/span&gt;);
  
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// cloning &amp;#39;anotherExample&amp;#39;is holding
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// new cloned object reference in example
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;  
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// down-casting as clone() return type is Object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        Example example = (Example) anotherExample.&lt;span style=&#34;color:#bbb&#34;&gt;clone&lt;/span&gt;();
  
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(example.&lt;span style=&#34;color:#bbb&#34;&gt;number&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(example.&lt;span style=&#34;color:#bbb&#34;&gt;str&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;serializable&#34;&gt;Serializable:&lt;/h4&gt;
&lt;p&gt;It is a marker interface in Java that is defined in the &lt;code&gt;java.io&lt;/code&gt; package. If we want to make the class serializable, we must implement the Serializable interface. If a class implements the Serializable interface, we can serialize or deserialize the state of an object of that class.&lt;/p&gt;
&lt;h6 id=&#34;serialization&#34;&gt;Serialization:&lt;/h6&gt;
&lt;p&gt;it is the action of converting an object into a byte stream. A mechanism in which the object state is read from the memory and written into a file or database or pass over the network. Deserialization (converting byte stream into an object) is the opposite of serialization means that object state reading from a file , database or over the network sending request and response and written back into memory is called deserialization of object.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Serialization (writing) can be achieved with the ObjectOutputStream class and deserialization (reading) can be achieved with the ObjectInputStream class.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.Serializable&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;User&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Serializable
{
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; id;
    String name;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;User&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; id, String name)
    {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt; = id;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt; = name;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now to write the user object in a file / database by serializing the data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day50&lt;/span&gt; {

   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String args[])
   {
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt;
       {
           &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Creating the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;           User user = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; User(000001,&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Kasun&amp;#34;&lt;/span&gt;);
           &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//Creating stream and writing the object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;           FileOutputStream fos=&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileOutputStream(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Users.txt&amp;#34;&lt;/span&gt;);
           ObjectOutputStream out=&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectOutputStream(fos);
           out.&lt;span style=&#34;color:#bbb&#34;&gt;writeObject&lt;/span&gt;(user);
           out.&lt;span style=&#34;color:#bbb&#34;&gt;flush&lt;/span&gt;();
           &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//closing the stream
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;           out.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
           System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Data has been written to the file.&amp;#34;&lt;/span&gt;);
       }
       &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt;(Exception e)
       {
           e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
       }
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now to deserialize the object from the file&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day50&lt;/span&gt; {

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, ClassNotFoundException {
        FileInputStream fis =  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Users.txt&amp;#34;&lt;/span&gt;);
        ObjectInputStream ois = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectInputStream(fis);
        User user =  (User)ois.&lt;span style=&#34;color:#bbb&#34;&gt;readObject&lt;/span&gt;();

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;User Name: &amp;#34;&lt;/span&gt;+ user.&lt;span style=&#34;color:#bbb&#34;&gt;name&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;User ID: &amp;#34;&lt;/span&gt;+ user.&lt;span style=&#34;color:#bbb&#34;&gt;id&lt;/span&gt;);
        ois.&lt;span style=&#34;color:#bbb&#34;&gt;close&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;reading data and deserialize the data to a &lt;code&gt;User&lt;/code&gt; object from the &lt;strong&gt;Users.txt&lt;/strong&gt; file.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 49: A utility class for Zip and Unzip files using java FileSystem api (Part 2)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day49/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day49/</id>
    <published>2022-05-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Zip and Unzip file using Java FileSystem api</summary>
    <content type="html">&lt;p&gt;In previous post we have explored and wrote a utility class for zipping and unzipping files and folders using java Zip api. Now we will see another api provided by java named &lt;code&gt;FileSystem&lt;/code&gt; under &lt;code&gt;java.nio.file&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;filesystem&#34;&gt;FileSystem:&lt;/h4&gt;
&lt;p&gt;FileSystem api of java non-blocking io&amp;rsquo;s file is an interface to underlying file system. It&amp;rsquo;s the factory for object to access &lt;code&gt;File&lt;/code&gt; and other objects in the file system.&lt;/p&gt;
&lt;p&gt;The default file system, obtained by invoking the &lt;code&gt;FileSystems.getDefault()&lt;/code&gt; method, provides access to the file system that is accessible to the Java virtual machine. The &lt;code&gt;FileSystems&lt;/code&gt; class defines methods to create file systems that provide access to other types of (custom) file systems.&lt;/p&gt;
&lt;p&gt;In java there are 3 file system providers.&lt;/p&gt;
&lt;p&gt;A provider is a factory for one or more &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html&#34; title=&#34;class in java.nio.file&#34;&gt;&lt;code&gt;FileSystem&lt;/code&gt;&lt;/a&gt; instances. Each file system is identified by a &lt;code&gt;URI&lt;/code&gt; where the URI&amp;rsquo;s scheme matches the provider&amp;rsquo;s &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/spi/FileSystemProvider.html#getScheme()&#34;&gt;&lt;code&gt;scheme&lt;/code&gt;&lt;/a&gt;. The default file system, for example, is identified by the URI &lt;code&gt;&amp;quot;file:///&amp;quot;&lt;/code&gt;. A memory-based file system, for example, may be identified by a URI such as &lt;code&gt;&amp;quot;memory:///?name=logfs&amp;quot;&lt;/code&gt;. The &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/spi/FileSystemProvider.html#newFileSystem(java.net.URI,%20java.util.Map)&#34;&gt;&lt;code&gt;newFileSystem&lt;/code&gt;&lt;/a&gt; method may be used to create a file system, and the &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/spi/FileSystemProvider.html#getFileSystem(java.net.URI)&#34;&gt;&lt;code&gt;getFileSystem&lt;/code&gt;&lt;/a&gt; method may be used to obtain a reference to an existing file system created by the provider. Where a provider is the factory for a single file system then it is provider dependent if the file system is created when the provider is initialized, or later when the &lt;code&gt;newFileSystem&lt;/code&gt; method is invoked. In the case of the default provider, the &lt;code&gt;FileSystem&lt;/code&gt; is created when the provider is initialized.&lt;/p&gt;
&lt;h4 id=&#34;filesystemproviders&#34;&gt;FileSystemProviders:&lt;/h4&gt;
&lt;p&gt;A Service-provider class for file systems. A file system provider is a concrete implementation of this class that implements the abstract methods defined by this class. A provider is identified by a &lt;code&gt;URI&lt;/code&gt; &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/spi/FileSystemProvider.html#getScheme()&#34;&gt;&lt;code&gt;scheme&lt;/code&gt;&lt;/a&gt;. The default provider is identified by the URI scheme &amp;ldquo;file&amp;rdquo;. It creates the &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html&#34; title=&#34;class in java.nio.file&#34;&gt;&lt;code&gt;FileSystem&lt;/code&gt;&lt;/a&gt; that provides access to the file systems accessible to the Java virtual machine. The &lt;a href=&#34;https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystems.html&#34; title=&#34;class in java.nio.file&#34;&gt;&lt;code&gt;FileSystems&lt;/code&gt;&lt;/a&gt; class defines how file system providers are located and loaded. The default provider is typically a system-default provider but may be overridden if the system property &lt;code&gt;java.nio.file.spi.DefaultFileSystemProvider&lt;/code&gt; is set. In that case, the provider has a one argument constructor whose formal parameter type is &lt;code&gt;FileSystemProvider&lt;/code&gt;. All other providers have a zero argument constructor that initializes the provider.&lt;/p&gt;
&lt;h4 id=&#34;zipfilesystemprovider&#34;&gt;ZipFileSystemProvider:&lt;/h4&gt;
&lt;p&gt;The zip file system provider treats a zip or JAR file as a file system and provides the ability to manipulate the contents of the file. The zip file system provider creates multiple file systems — one file system for each zip or JAR file.&lt;/p&gt;
&lt;p&gt;ZipFileSystemProvider to create a &lt;code&gt;Folder.zip&lt;/code&gt; and archive a single file and a direcotry/folder&lt;/p&gt;
&lt;h5 id=&#34;single-file-to-zip-file&#34;&gt;Single File to Zip file&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;ZipSingleFile&lt;/span&gt;(Path source, String fileName) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!Files.&lt;span style=&#34;color:#bbb&#34;&gt;isRegularFile&lt;/span&gt;(source)) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Please provide a file.&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
            }

            Map&amp;lt;String, String&amp;gt; env = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Create the zip file if it doesn&amp;#39;t exist
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            env.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;create&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;);

            URI uri = URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jar:file:/home/mohibulhasan/Documents/&amp;#34;&lt;/span&gt; + fileName);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (FileSystem zipFileSystem = FileSystems.&lt;span style=&#34;color:#bbb&#34;&gt;newFileSystem&lt;/span&gt;(uri, env)) {
                Path pathInZipfile = zipFileSystem.&lt;span style=&#34;color:#bbb&#34;&gt;getPath&lt;/span&gt;(source.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Copy a file into the zip file path
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                Files.&lt;span style=&#34;color:#bbb&#34;&gt;copy&lt;/span&gt;(source, pathInZipfile, StandardCopyOption.&lt;span style=&#34;color:#bbb&#34;&gt;REPLACE_EXISTING&lt;/span&gt;);
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e);
            }

        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;folder-to-zip&#34;&gt;Folder to Zip:&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;zipFolder&lt;/span&gt;(Path source) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get current working directory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    String currentPath = System.&lt;span style=&#34;color:#bbb&#34;&gt;getProperty&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;user.dir&amp;#34;&lt;/span&gt;) + File.&lt;span style=&#34;color:#bbb&#34;&gt;separator&lt;/span&gt;;

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get folder name as zip file name
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// can be other extension, .foo .bar .whatever
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    String zipFileName = source.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.zip&amp;#34;&lt;/span&gt;;
    URI uri = URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jar:file:&amp;#34;&lt;/span&gt; + currentPath + zipFileName);

    Files.&lt;span style=&#34;color:#bbb&#34;&gt;walkFileTree&lt;/span&gt;(source, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SimpleFileVisitor&amp;lt;&amp;gt;() {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileVisitResult &lt;span style=&#34;color:#447fcf&#34;&gt;visitFile&lt;/span&gt;(Path file, BasicFileAttributes attributes) {

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// don&amp;#39;t copy symboliclink as its not supported
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (attributes.&lt;span style=&#34;color:#bbb&#34;&gt;isSymbolicLink&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
            }

            Map&amp;lt;String, String&amp;gt; env = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashMap&amp;lt;&amp;gt;();
            env.&lt;span style=&#34;color:#bbb&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;create&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (FileSystem zipfs = FileSystems.&lt;span style=&#34;color:#bbb&#34;&gt;newFileSystem&lt;/span&gt;(uri, env)) {

                Path targetFile = source.&lt;span style=&#34;color:#bbb&#34;&gt;relativize&lt;/span&gt;(file);
                Path pathInZipfile = zipfs.&lt;span style=&#34;color:#bbb&#34;&gt;getPath&lt;/span&gt;(targetFile.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// NoSuchFileException, need create parent directories in zip path
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (pathInZipfile.&lt;span style=&#34;color:#bbb&#34;&gt;getParent&lt;/span&gt;() != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                    Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(pathInZipfile.&lt;span style=&#34;color:#bbb&#34;&gt;getParent&lt;/span&gt;());
                }

                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// copy file attributes
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                CopyOption[] options = {StandardCopyOption.&lt;span style=&#34;color:#bbb&#34;&gt;REPLACE_EXISTING&lt;/span&gt;, StandardCopyOption.&lt;span style=&#34;color:#bbb&#34;&gt;COPY_ATTRIBUTES&lt;/span&gt;, LinkOption.&lt;span style=&#34;color:#bbb&#34;&gt;NOFOLLOW_LINKS&lt;/span&gt;};
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Copy a file into the zip file path
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                Files.&lt;span style=&#34;color:#bbb&#34;&gt;copy&lt;/span&gt;(file, pathInZipfile, options);

            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
        }

        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileVisitResult &lt;span style=&#34;color:#447fcf&#34;&gt;visitFileFailed&lt;/span&gt;(Path file, IOException exc) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Unable to zip : %s%n%s%n&amp;#34;&lt;/span&gt;, file, exc);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
        }

    });

}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this case by accessing and then copying the file from the &lt;code&gt;Folder.zip&lt;/code&gt; file to and external folder will behave like unzip.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 48: A utility class for Zip and Unzip files using java Zip api (Part 1)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day48/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day48/</id>
    <published>2022-04-11T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">A utility class to zip and unzip files and directories</summary>
    <content type="html">&lt;p&gt;In java there is api for Zip (archiving) and Unzip a file or a set of files and directory and then place its contents or the zip file in the directory.&lt;/p&gt;
&lt;p&gt;In java there are two ways of zipping and unzipping file&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using &lt;code&gt;ZipInputStream&lt;/code&gt; and &lt;code&gt;ZipOutputStream&lt;/code&gt; with &lt;code&gt;ZipEntry&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Using &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/technotes/guides/io/fsp/zipfilesystemprovider.html&#34; title=&#34;Zip File System Provider&#34;&gt;Zip File System Provider&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For &lt;code&gt;part 1&lt;/code&gt; i will write a utility class using &lt;code&gt;ZipInputStream&lt;/code&gt; and &lt;code&gt;ZipOutputStream&lt;/code&gt; class to zip and unzip file and folder. In the subsequent part i will write about zip file system provider api&lt;/p&gt;
&lt;h4 id=&#34;what-is-an-archive-in-context-of-computer-filesystem-&#34;&gt;What is an archive in context of computer filesystem :&lt;/h4&gt;
&lt;p&gt;an archive file is &lt;strong&gt;a computer file that is composed of one or more files along with metadata&lt;/strong&gt;. Archive files are used to collect multiple data files together into a single file for easier portability and storage, or simply to compress files to use less storage space.&lt;/p&gt;
&lt;h4 id=&#34;zip-file&#34;&gt;ZIP File:&lt;/h4&gt;
&lt;p&gt;ZIP is an archive file format that supports lossless data compression.&lt;/p&gt;
&lt;p&gt;A ZIP file may contain one or more files or directories that may have been compressed. The ZIP file format permits a number of compression algorithms.&lt;/p&gt;
&lt;p&gt;In java when used ZipInputStream and ZipOutputStream we  can create zip file and by using ZipEntry to entry the file in the &lt;code&gt;.zip&lt;/code&gt; file. To better understand ZipEntry a picture of files and its zip file and what are ZipEntry regarding that file is given below.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s1.o7planning.com/en/10195/images/18542.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;h4 id=&#34;zip-single-file&#34;&gt;Zip Single File:&lt;/h4&gt;
&lt;p&gt;Now to create a zip file of any particular file an utility class is created &lt;code&gt;ZipUtils&lt;/code&gt; which will use &lt;code&gt;ZipInputStream&lt;/code&gt; along with &lt;code&gt;ZipOutputStream&lt;/code&gt; to zip and unzip any files. In this &lt;code&gt;ZipUtils&lt;/code&gt; class the &lt;code&gt;zipSingleFile()&lt;/code&gt; method will take the file path for&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ZipUtils&lt;/span&gt; {

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;zipSingleFile&lt;/span&gt;(Path source, Path zipFileName) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!Files.&lt;span style=&#34;color:#bbb&#34;&gt;isRegularFile&lt;/span&gt;(source)) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Please provide a file.&amp;#34;&lt;/span&gt;);
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;;
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (ZipOutputStream zos = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ZipOutputStream(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileOutputStream(zipFileName.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;())); FileInputStream fis = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(source.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;())) {

                ZipEntry zipEntry = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ZipEntry(source.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
                zos.&lt;span style=&#34;color:#bbb&#34;&gt;putNextEntry&lt;/span&gt;(zipEntry);

                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] buffer = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[1024];
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; len;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((len = fis.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;(buffer)) &amp;gt; 0) {
                    zos.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(buffer, 0, len);
                }
                zos.&lt;span style=&#34;color:#bbb&#34;&gt;closeEntry&lt;/span&gt;();
            }
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;this &lt;code&gt;zipSingleFile()&lt;/code&gt; takes two arguments one is the source file path and another is for where to store the created zip file and its name.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day48&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path OUTPUT_ZIP_FILE = Path.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Documents/Folder.zip&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Path SOURCE_FILE = Path.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Documents/example.txt&amp;#34;&lt;/span&gt;);
        
        ZipUtils.&lt;span style=&#34;color:#bbb&#34;&gt;zipSingleFile&lt;/span&gt;(Path.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Documents/example.txt&amp;#34;&lt;/span&gt;),OUTPUT_ZIP_FILE);
       }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this case the new zip file that will be created would be inside /home/mohibulhasan/Documents/ and as Folder.zip&lt;/p&gt;
&lt;h4 id=&#34;zip-a-folder&#34;&gt;Zip a folder:&lt;/h4&gt;
&lt;p&gt;In case of a directory in ZipUtils class there is a method &lt;code&gt;zipFolder()&lt;/code&gt; which will use a source directory as path to zip all the contents of that directory&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;zipFolder&lt;/span&gt;(Path source) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get folder name as zip file name
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            String zipFileName = source.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getAbsolutePath&lt;/span&gt;() + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.zip&amp;#34;&lt;/span&gt;;

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (ZipOutputStream zos = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ZipOutputStream(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileOutputStream(zipFileName))) {

                Files.&lt;span style=&#34;color:#bbb&#34;&gt;walkFileTree&lt;/span&gt;(source, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SimpleFileVisitor&amp;lt;&amp;gt;() {
                    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileVisitResult &lt;span style=&#34;color:#447fcf&#34;&gt;visitFile&lt;/span&gt;(Path file, BasicFileAttributes attributes) {

                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// only copy files, no symbolic links
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (attributes.&lt;span style=&#34;color:#bbb&#34;&gt;isSymbolicLink&lt;/span&gt;()) {
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
                        }

                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (FileInputStream fis = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(file.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;())) {

                            Path targetFile = source.&lt;span style=&#34;color:#bbb&#34;&gt;relativize&lt;/span&gt;(file);
                            zos.&lt;span style=&#34;color:#bbb&#34;&gt;putNextEntry&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ZipEntry(targetFile.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;()));

                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] buffer = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[1024];
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; len;
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; ((len = fis.&lt;span style=&#34;color:#bbb&#34;&gt;read&lt;/span&gt;(buffer)) &amp;gt; 0) {
                                zos.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(buffer, 0, len);
                            }

                            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// if large file, throws out of memory
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//byte[] bytes = Files.readAllBytes(file);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//zos.write(bytes, 0, bytes.length);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
                            zos.&lt;span style=&#34;color:#bbb&#34;&gt;closeEntry&lt;/span&gt;();

                            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Zip file : %s%n&amp;#34;&lt;/span&gt;, file);

                        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
                            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
                        }
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
                    }

                    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; FileVisitResult &lt;span style=&#34;color:#447fcf&#34;&gt;visitFileFailed&lt;/span&gt;(Path file, IOException exc) {
                        System.&lt;span style=&#34;color:#bbb&#34;&gt;err&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Unable to zip : %s%n%s%n&amp;#34;&lt;/span&gt;, file, exc);
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; FileVisitResult.&lt;span style=&#34;color:#bbb&#34;&gt;CONTINUE&lt;/span&gt;;
                    }
                });

            }

        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this method &lt;code&gt;Files.walkFileTree()&lt;/code&gt; is used for to visit all the files in the directory and take each file and put them inside the zipEntry. Then ZipOutputStream is used to create the zipEntry&amp;rsquo;s and the added.&lt;/p&gt;
&lt;h4 id=&#34;unzip-a-zip-file&#34;&gt;Unzip a .zip File:&lt;/h4&gt;
&lt;p&gt;If need to unzip a &lt;code&gt;.zip&lt;/code&gt; file and extract the files and folder of that zip file, we need to give the zip file path and destiantion path where the .zip file will be extracted.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;unzipIt&lt;/span&gt;(Path sourceFilePath, Path destFilePath) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (ZipInputStream zis = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ZipInputStream(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(sourceFilePath.&lt;span style=&#34;color:#bbb&#34;&gt;toFile&lt;/span&gt;()))) {

                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// list files in zip
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                ZipEntry zipEntry = zis.&lt;span style=&#34;color:#bbb&#34;&gt;getNextEntry&lt;/span&gt;();

                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (zipEntry != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {

                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; isDirectory = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;;
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// some zip stored files and folders separately
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// e.g data/
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//     data/folder/
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//     data/folder/file.txt
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (zipEntry.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;endsWith&lt;/span&gt;(File.&lt;span style=&#34;color:#bbb&#34;&gt;separator&lt;/span&gt;)) {
                        isDirectory = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;;
                    }

                    Path newPath = zipSlipProtect(zipEntry, destFilePath);

                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (isDirectory) {
                        Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(newPath);
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {

                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// some zip stored file path only, need create parent directories
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// e.g data/folder/file.txt
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (newPath.&lt;span style=&#34;color:#bbb&#34;&gt;getParent&lt;/span&gt;() != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#bbb&#34;&gt;notExists&lt;/span&gt;(newPath.&lt;span style=&#34;color:#bbb&#34;&gt;getParent&lt;/span&gt;())) {
                                Files.&lt;span style=&#34;color:#bbb&#34;&gt;createDirectories&lt;/span&gt;(newPath.&lt;span style=&#34;color:#bbb&#34;&gt;getParent&lt;/span&gt;());
                            }
                        }

                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// copy files, nio
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                        Files.&lt;span style=&#34;color:#bbb&#34;&gt;copy&lt;/span&gt;(zis, newPath, StandardCopyOption.&lt;span style=&#34;color:#bbb&#34;&gt;REPLACE_EXISTING&lt;/span&gt;);

                        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// copy files, classic
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*try (FileOutputStream fos = new FileOutputStream(newPath.toFile())) {
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                        byte[] buffer = new byte[1024];
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                        int len;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                        while ((len = zis.read(buffer)) &amp;gt; 0) {
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                            fos.write(buffer, 0, len);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                        }
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;                    }*/&lt;/span&gt;
                    }

                    zipEntry = zis.&lt;span style=&#34;color:#bbb&#34;&gt;getNextEntry&lt;/span&gt;();

                }
                zis.&lt;span style=&#34;color:#bbb&#34;&gt;closeEntry&lt;/span&gt;();

            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {

            }
        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;while doing the unzip all the zipEntry are checked and until all of them are processed the mehtod will check if that zip entry is a file or a folder and if its a folder it will create a folder in the desitantion folder for that particular entry. Some file will have &lt;code&gt;relative path&lt;/code&gt; so it will also make the parent folders.&lt;/p&gt;
&lt;p&gt;While trying to unzip a &lt;code&gt;.zip&lt;/code&gt; in this case the zip file it may cause ZipSlip Attack,&lt;/p&gt;
&lt;h4 id=&#34;zip-slip-attack&#34;&gt;Zip Slip Attack:&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.infoq.com/news/2018/06/zip-slip/&#34; title=&#34;Zip Slip attack&#34;&gt;zip slip attack&lt;/a&gt; is  an attack that adds entries to a zip file that will be unzipped, entries consisting relative file paths with one or more &lt;code&gt;/..&lt;/code&gt; sections in the path the final path of the file could end up being outside the directory into which the ZipFile is requested unzipped to. Let&amp;rsquo;s look at an example:&lt;/p&gt;
&lt;p&gt;Zip file to be unzipped to the directory &lt;code&gt;/apps/example/data/unzipped-file&lt;/code&gt;. An entry in the Zip file has the relative path &lt;code&gt;../../../../etc/hosts&lt;/code&gt; . The final path of that entry becomes: &lt;code&gt;/apps/example/data/unzipped-file/../../../../etc/hosts&lt;/code&gt; which is equivalent of &lt;code&gt;/etc/hosts&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;In the case of linux  based systems unzipping this file could potentially overwrite our hosts file,enabling the attacker to point e.g. &lt;a href=&#34;http://www.facebook.com&#34;&gt;www.facebook.com&lt;/a&gt; to an IP address of their own choice. The next time you try to access Facebook from that computer, it won&amp;rsquo;t be the real Facebook you are accessing, but the attacker&amp;rsquo;s spoofed version. Once you login, the attacker now has your username and password, and your Facebook account can be hacked.&lt;/p&gt;
&lt;p&gt;To avoid this a method &lt;code&gt;zipSlipProtect()&lt;/code&gt; method is implemented which will check if the path of the zip entry is outside of the destination directory or not.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Path &lt;span style=&#34;color:#447fcf&#34;&gt;zipSlipProtect&lt;/span&gt;(ZipEntry zipEntry, Path destinationDirectory) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// test zip slip vulnerability
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Path targetDirResolved = targetDir.resolve(&amp;#34;../../&amp;#34; + zipEntry.getName());
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
            Path targetDirResolved = destinationDirectory.&lt;span style=&#34;color:#bbb&#34;&gt;resolve&lt;/span&gt;(zipEntry.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());

            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// make sure normalized file still has targetDir as its prefix
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// else throws exception
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;            Path normalizePath = targetDirResolved.&lt;span style=&#34;color:#bbb&#34;&gt;normalize&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!normalizePath.&lt;span style=&#34;color:#bbb&#34;&gt;startsWith&lt;/span&gt;(destinationDirectory)) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; IOException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Bad zip entry: &amp;#34;&lt;/span&gt; + zipEntry.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; normalizePath;
        }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this method by using the &lt;a href=&#34;https://www.geeksforgeeks.org/path-resolve-method-in-java-with-examples/&#34; title=&#34;Path resolve&#34;&gt;Path.resolve()&lt;/a&gt;  and &lt;a href=&#34;https://www.geeksforgeeks.org/path-normalize-method-in-java-with-examples/&#34;&gt;Path.normalize()&lt;/a&gt; to check if the normalize file path still has the destiantion direcotry as its prefix or not.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 47: ThreadMXBean to get information about thread&#39;s status, deadlock monitoring and cpu time that the thread got etc.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day47/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day47/</id>
    <published>2022-03-28T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using ThreadMXBean get thread execution and monitoring related information for running threads in jvm</summary>
    <content type="html">&lt;p&gt;Java Management Extension  or &lt;strong&gt;JMX&lt;/strong&gt; framwork provides an easily configurable, scalable, reliable and more or less friendly infrastructure for managing Java application either locally or remotely. The framework introduces the concept of MBeans for real-time management of applications.&lt;/p&gt;
&lt;h4 id=&#34;mxbean&#34;&gt;MXBean:&lt;/h4&gt;
&lt;p&gt;An MXBean is &lt;strong&gt;a type of MBean that references only a predefined set of data types&lt;/strong&gt;. In this way, you can be sure that your MBean will be usable by any client, including remote clients, without any requirement that the client have access to model-specific classes representing the types of your MBeans&lt;/p&gt;
&lt;h4 id=&#34;threadmxbean&#34;&gt;ThreadMXBean:&lt;/h4&gt;
&lt;p&gt;The management interface for the thread system of the Java virtual machine.&lt;/p&gt;
&lt;p&gt;A Java virtual machine has a single instance of the implementation class of this interface. This instance implementing this interface is an &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/lang/management/ManagementFactory.html#MXBean&#34;&gt;MXBean&lt;/a&gt; that can be obtained by calling the &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/lang/management/ManagementFactory.html#getThreadMXBean--&#34;&gt;&lt;code&gt;ManagementFactory.getThreadMXBean()&lt;/code&gt;&lt;/a&gt; method or from the &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/lang/management/ManagementFactory.html#getPlatformMBeanServer--&#34;&gt;&lt;code&gt;platform MBeanServer&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;ThreadMXBean&lt;/code&gt; we can get information about&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dumping all live threads and their stack trace&lt;/li&gt;
&lt;li&gt;Finding deadlock threads those are waiting to get monitors / ownable synchronizes&lt;/li&gt;
&lt;li&gt;Thread count for live daemon / non daemon threads&lt;/li&gt;
&lt;li&gt;If cpu thread time and user thread time and &lt;code&gt;Thread Contention&lt;/code&gt; Monitoring supported&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now using &lt;code&gt;ThreadMXBean&lt;/code&gt; get thread count, currentThreadCpuTime, currentThreadUserTime&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day47&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
            ThreadMXBean threadMXBean = ManagementFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadMXBean&lt;/span&gt;();
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread count is &amp;#34;&lt;/span&gt;+threadMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadCount&lt;/span&gt;());
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Current Thread CPU time &amp;#34;&lt;/span&gt;+TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(threadMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;getCurrentThreadCpuTime&lt;/span&gt;(),TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;));
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(MessageFormat.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Current Thread User time {0} &amp;#34;&lt;/span&gt;,TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;MILLISECONDS&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;convert&lt;/span&gt;(threadMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;getCurrentThreadUserTime&lt;/span&gt;(),TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;NANOSECONDS&lt;/span&gt;));
    
            List&amp;lt;ThreadInfo&amp;gt; threadInfos = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(threadMXBean.&lt;span style=&#34;color:#bbb&#34;&gt;dumpAllThreads&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;));
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (ThreadInfo threadInfo: threadInfos) {
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(MessageFormat.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Thread Name is {0} | Thread id -&amp;gt; {1}&amp;#34;&lt;/span&gt;,threadInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadName&lt;/span&gt;(),threadInfo.&lt;span style=&#34;color:#bbb&#34;&gt;getThreadId&lt;/span&gt;()));
            }
        }
      }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here getting total thread count running in jvm, current thread cpu time (if JVM supports it) it returns in nano second so using &lt;code&gt;TimeUnit.MILISECONDS.convert()&lt;/code&gt; to convert it to Miliseconds also current thread user time. After that dumping all the threads and getting the name and id of the threads.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 46: Writing a generic and thread safe ObjectPool to enable pooling for any type of class</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day46/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day46/</id>
    <published>2022-03-16T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing ObjectPool pattern to get any type object pooling</summary>
    <content type="html">&lt;p&gt;When objects are expensive to create and they are needed only for short periods of time it is advantageous to utilize the Object Pool pattern. The Object Pool provides a cache for instantiated objects tracking which ones are in use and which are available.&lt;/p&gt;
&lt;p&gt;Here creating a &lt;code&gt;HttpClient&lt;/code&gt; object pool to create &lt;code&gt;HttpClientPool&lt;/code&gt; to get avaialbe and in use instances&lt;/p&gt;
&lt;p&gt;To do that at first created a generic &lt;code&gt;ObjectPool&amp;lt;T&amp;gt;&lt;/code&gt; where to create an Object pool we have to pass the type of the object and then extend a class to implement the abstraced behavior of the Object pools createing instance method &lt;code&gt;create()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;create()&lt;/code&gt; method will create the instance and there are two sets to manage the instances. &lt;code&gt;available&lt;/code&gt; set stores currently available instances from the pool and &lt;code&gt;in use&lt;/code&gt; set stores in uses instances of the pool. By calling the &lt;code&gt;getInstance()&lt;/code&gt; and &lt;code&gt;releaseInstance()&lt;/code&gt; method we can get and release an instance to object pool.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;ObjectPool&lt;/span&gt;&amp;lt;T&amp;gt; {

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Set&amp;lt;T&amp;gt; available = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashSet&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Set&amp;lt;T&amp;gt; inUse = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HashSet&amp;lt;&amp;gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;abstract&lt;/span&gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;create&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; T &lt;span style=&#34;color:#447fcf&#34;&gt;getInstance&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (available.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;()) {
                available.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(create());
            }
            var instance = available.&lt;span style=&#34;color:#bbb&#34;&gt;iterator&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;next&lt;/span&gt;();
            available.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(instance);
            inUse.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(instance);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; instance;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;releaseInstance&lt;/span&gt;(T instance) {
            inUse.&lt;span style=&#34;color:#bbb&#34;&gt;remove&lt;/span&gt;(instance);
            available.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(instance);
        }

        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;toString&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Pool available=%d inUse=%d&amp;#34;&lt;/span&gt;, available.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;(), inUse.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;());
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;when extending this abstract class, creating process should be implemented in the &lt;code&gt;create()&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;HttpClientPool&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;extends&lt;/span&gt; ObjectPool&amp;lt;HttpClient&amp;gt; {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;protected&lt;/span&gt; HttpClient &lt;span style=&#34;color:#447fcf&#34;&gt;create&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; HttpClient.&lt;span style=&#34;color:#bbb&#34;&gt;newHttpClient&lt;/span&gt;();
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;to see how the ObjectPool works now we use it in a class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day46&lt;/span&gt; {
   &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
       HttpClientPool httpClientPool = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; HttpClientPool();

       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
       HttpClient httpClient1 = httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
       String releaseInstance = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Release Instance &amp;#34;&lt;/span&gt;;
       String getInstance = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Get Instance &amp;#34;&lt;/span&gt;;
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(getInstance+ httpClient1);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       HttpClient httpClient2 = httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(getInstance+ httpClient2);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       HttpClient httpClient3 = httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(getInstance+httpClient3);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(releaseInstance+httpClient1);
       httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;releaseInstance&lt;/span&gt;(httpClient1);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(releaseInstance+httpClient2);
       httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;releaseInstance&lt;/span&gt;(httpClient2);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       HttpClient httpClient4 = httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(getInstance+ httpClient4);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());

       HttpClient httpClient5 = httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;getInstance&lt;/span&gt;();
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(getInstance+ httpClient5);
       System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(httpClientPool.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;());
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here the output is&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-Pool&#34; data-lang=&#34;Pool&#34;&gt;Get Instance jdk.internal.net.http.HttpClientImpl@75c072cb(1)
Pool available=0 inUse=1
Get Instance jdk.internal.net.http.HttpClientImpl@e50a6f6(2)
Pool available=0 inUse=2
Get Instance jdk.internal.net.http.HttpClientImpl@53ca01a2(3)
Pool available=0 inUse=3
Release Instance jdk.internal.net.http.HttpClientImpl@75c072cb(1)
Pool available=1 inUse=2
Release Instance jdk.internal.net.http.HttpClientImpl@e50a6f6(2)
Pool available=2 inUse=1
Get Instance jdk.internal.net.http.HttpClientImpl@e50a6f6(2)
Pool available=1 inUse=2
Get Instance jdk.internal.net.http.HttpClientImpl@75c072cb(1)
Pool available=0 inUse=3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;at first pool does not have any instances then it creates and tag it as a in use instance1. then it does the same for instance2 and instance3 then it releases instance and thus the available set shows it have one instance then instance2 is released&lt;/p&gt;
&lt;p&gt;so inuse = 1 and available = 2 and then again calling &lt;code&gt;etInstance()&lt;/code&gt; gives instance from the &lt;code&gt;available&lt;/code&gt; set, thus not creating any new instances of HttpClient&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 45: learning about the internals of JVM and JRE (part 3)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day45/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day45/</id>
    <published>2022-03-01T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">learning what is Runtime and Runtime environment and Java Runtime</summary>
    <content type="html">&lt;p&gt;&lt;code&gt;Runtime&lt;/code&gt; and &lt;code&gt;Runtime Environment&lt;/code&gt; are some of the most overloaded terms in software development. It’s confusing for everyone; this word means many different things in many different contexts. This post’s goal is to provide you with an intuition behind the many use-cases of &lt;code&gt;Runtime&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Runtime is used both as adjective and noun in most of the time.&lt;/p&gt;
&lt;h3 id=&#34;runtime--the-lifecycle-noun&#34;&gt;&lt;strong&gt;Runtime — The Lifecycle (Noun)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The first meaning of runtime is with regards to program lifecycle. This refers to the period of time in which a program is executing. A intuitive comparison is often made between compile time and runtime.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The IDE is spitting out a lot of new warnings during compile time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This process is outputting a lot of logs during runtime.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;runtime--during-the-lifecycle-adjective&#34;&gt;&lt;strong&gt;Runtime — During The Lifecycle (Adjective)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;In the same context of program lifecycle, runtime is also commonly used as an adjective. This is sometimes hyphenated as “run-time.” The &lt;a href=&#34;http://oreillymedia.github.io/production-resources/styleguide/#getting_started&#34;&gt;O’Reilly Style Guide&lt;/a&gt; recommends using “runtime” for both nouns and adjectives.&lt;/p&gt;
&lt;h3 id=&#34;runtime-environment&#34;&gt;&lt;strong&gt;Runtime Environment&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Armed with an intuition of runtime as a lifecycle, let’s discuss runtime environments. These two concepts are related, but subtlety different. Confusion is created because people abridge “runtime environment” to just “runtime.”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have to be careful that your Javascript program doesn’t have any runtime errors when it’s running in the Node.js runtime [environment].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: Did you see the release notes for the new JRE?&lt;/p&gt;
&lt;p&gt;A: Yea, there’s a lot of fancy stuff going on in the new Java Runtime [Environment].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In these examples, the standalone “runtime” refers to a “runtime environment.” In these situations, it’s better to be precise with your language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new Java Runtime Environment seems to be doing a better job with garbage collection.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Is there a way to control how many threads handle the I/O within the Node.js runtime environment?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;understanding-runtime-by-cooking-a-pizza&#34;&gt;&lt;strong&gt;Understanding Runtime by Cooking a Pizza&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;After developing a hunger  for a chicken cheese pizza, you decide to hop on Google to look for a recipe. After sifting through a few search results and scrolling past a few walls of ads, you find a clean step-by-step recipe that seems like a winner.&lt;/p&gt;
&lt;p&gt;Unfortunately, a recipe on its own is useless. The recipe you found on Google isn’t actually going to get you your pizza, you need a kitchen! The pizza recipe’s runtime environment is your kitchen.&lt;/p&gt;
&lt;p&gt;Your code is just code. Whatever code you write, in whatever language you choose, needs to eventually execute on a computer. Runtime environments enable this execution.&lt;/p&gt;
&lt;h3 id=&#34;common-runtime-environment--the-operating-system-&#34;&gt;&lt;strong&gt;Common Runtime Environment ( The Operating System )&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The universal runtime environment for any kind of programmatic execution is the operating system. The operating system is the only way you can get the CPU to execute your code. The OS is the silent hero that ensures your program gets some memory, gets scheduled fairly, and doesn’t disturb its neighbors. It doesn’t matter if you’re using C, Python, or Node.js—at the end of the day, the operating system is everyone’s runtime environment.&lt;/p&gt;
&lt;h4 id=&#34;executable-file-format&#34;&gt;Executable File format&lt;/h4&gt;
&lt;p&gt;Every operating system defines a binary file format for executable code. In Unix-Like operating systems, this is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Executable_and_Linkable_Format&#34;&gt;ELF file format&lt;/a&gt; (.so) . For windows its executable (.exe)&lt;/p&gt;
&lt;h4 id=&#34;executables-runtime-environment&#34;&gt;Executable&amp;rsquo;s Runtime Environment&lt;/h4&gt;
&lt;p&gt;An executable’s runtime environment is the operating system. In addition, operating systems ship with programs that are able to take these files and give them to the hardware to be executed. In Linux, one example is the &lt;a href=&#34;https://man7.org/linux/man-pages/man2/execve.2.html&#34;&gt;&lt;em&gt;execve()&lt;/em&gt;&lt;/a&gt; program. For all other operating systems, there will be a similar set of file formats and loader programs.&lt;/p&gt;
&lt;h3 id=&#34;higher-level-runtime-environments&#34;&gt;Higher-Level Runtime Environments&lt;/h3&gt;
&lt;p&gt;As programming languages evolved, people wanted an environment that could handle additional tasks that felt cumbersome for developers.Wouldn’t some kind of automatic reference counting and garbage collection be extremely convenient? Some people say &lt;strong&gt;yes&lt;/strong&gt; and this is how fancier runtime environments like the JRE developed.&lt;/p&gt;
&lt;p&gt;Another popular higher-level runtime environment is Node.js. Many developers refer to this as the “Node.js Runtime” or simply just “Node.” Node is a runtime environment for the Javascript language, similar to how the JRE is a runtime environment for the Java language. Node comes with fancy features like a callback queue, an event loop, and a thread pool. Just like the JRE, these bells and whistles exist to make our lives easier as developers.&lt;/p&gt;
&lt;p&gt;With higher-level runtime environments, features can become blurred across the language and its environment. Within the Java ecosystem, the automatic garbage collection feature is not technically a feature of the Java language itself, but is actually a feature of the JRE. 95% of developers won’t bother making this distinction. The statement “&lt;em&gt;Java has automatic memory management&lt;/em&gt;” can more precisely be stated as, “&lt;em&gt;The Java Runtime Environment has automatic memory management&lt;/em&gt;.” As a warning, you’ll get some unpleasant glares if you ever decide to correct someone over these kind of semantics.&lt;/p&gt;
&lt;h3 id=&#34;runtime-environment-layers&#34;&gt;Runtime Environment Layers&lt;/h3&gt;
&lt;p&gt;Runtime environments have their own runtime environments. If you download the Node binary for Linux, you’ll find that it’s just another ELF executable waiting to be run by the OS. So we could say—Javascript’s runtime environment is Node, and Node’s runtime environment is the operating system. Or you could also say—Javascript’s runtime environment is a combination of Node and the operating system. Again, dive deep enough and everyone’s runtime environment ends up being the operating system.&lt;/p&gt;
&lt;h3 id=&#34;interpreting-languages&#34;&gt;Interpreting Languages&lt;/h3&gt;
&lt;p&gt;Code does not always have to be compiled to OS/architecture-specific binaries. A common pattern is to execute your programs via interpreters. For example, a Python interpreter can read your Python source and produce corresponding machine instructions for your computer to execute. This conveniently makes Python source very portable. However, the Python interpreter itself is a compiled executable, built for a specific OS/architecture, who’s runtime environment is the operating system.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is no such thing as interpreted languages or non-interpreted languages. A programming language is just a syntax. Python interpreters are the most popular way to execute Python source, but it’s not the only way. Programmers are creative. I’m sure developers have found ways to compile Python/Javascript into executables or have even created ways to interpret C.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;java-programs-runtime-environment&#34;&gt;Java Program’s Runtime Environment&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.tutorialandexample.com/wp-content/uploads/2019/11/Difference-between-JDK-JRE-JVM.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;What does it take to execute a Java program on your computer? This is very close to an executable’s runtime environment; all we need to do is to make sure our java  source can turn into a proper bytecode.&lt;/p&gt;
&lt;p&gt;This step is familiar to everyone. Java compiler takes your java code and create a properly formatted bytecode (.class) file, targeted for jvm.&lt;/p&gt;
&lt;p&gt;A subtler part of java compilers is that they also provide a collection of java &lt;a href=&#34;https://en.wikipedia.org/wiki/Runtime_library&#34;&gt;runtime library&lt;/a&gt; that is automatically compiled into your program. The purpose of these libraries is to provide you—the programmer—with basic facilities to interact with the runtime environment. For a compiled java program as an bytecode executable in jvm, this environment is the jvm. For example, the java runtime library provides useful systems like &lt;em&gt;JIT&lt;/em&gt; and &lt;em&gt;java bytecode interpreter&lt;/em&gt; that allow you to manage memory and to help prepare it for execution, and many, many other things.&lt;/p&gt;
&lt;p&gt;Any library that allows a program to interact with the operating system will be heavily tailored to that operating system.Java by using JVM talks with operating system and executes the program in jvm and jvm facilitates all the necessary library and function calls. For java, the runtime libraries and functions we just discussed are part of a larger umbrella library referred to as JRE. This is an official standard.&lt;/p&gt;
&lt;p&gt;A Java program’s runtime environment is the jvm&amp;rsquo;s runtime environment,  which in turn operating system. The important point to remember is that &lt;strong&gt;all&lt;/strong&gt; code—from assembly to Javascript—needs some kind of environment in order execute, just like all recipes need some kind of kitchen to turn into food.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 44: learning about the internals of JRE and JVM (Part 2)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day44/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day44/</id>
    <published>2022-02-24T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">learning about jvm  architecture</summary>
    <content type="html">&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.javainterviewpoint.com/java-virtual-machine-architecture-in-java/jvm-architecture/&#34; alt=&#34;The JVM Architecture Explained - DZone Java&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;JVM has 4 major parts&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Class Loader&lt;/li&gt;
&lt;li&gt;Runtime Data areas&lt;/li&gt;
&lt;li&gt;Execution engine&lt;/li&gt;
&lt;li&gt;Native interface and method libraries&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;classloader&#34;&gt;Classloader:&lt;/h3&gt;
&lt;p&gt;Class loaders are responsible for &lt;strong&gt;loading Java classes dynamically to the JVM&lt;/strong&gt; &lt;strong&gt;(Java Virtual Machine) during runtime.&lt;/strong&gt; They&amp;rsquo;re also part of the JRE (Java Runtime Environment). So, the JVM doesn&amp;rsquo;t need to know about the underlying files or file systems in order to run Java programs thanks to class loaders.&lt;/p&gt;
&lt;p&gt;Furthermore, these Java classes aren&amp;rsquo;t loaded into memory all at once, but rather when they&amp;rsquo;re required by an application. This is where class loaders come into the picture. They&amp;rsquo;re responsible for loading classes into memory.&lt;/p&gt;
&lt;p&gt;classloader subsystem does 3 things mainly&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Class Loading&lt;/li&gt;
&lt;li&gt;Linking&lt;/li&gt;
&lt;li&gt;Initializing&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;class-loading-mechanism&#34;&gt;Class Loading Mechanism:&lt;/h5&gt;
&lt;p&gt;The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a &lt;code&gt;parent&lt;/code&gt; class loader. When loading a class, a class loader first &lt;code&gt;delegates&lt;/code&gt; the search for the class to its parent class loader before attempting to find the class itself.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Constructors in java.lang.ClassLoader and its subclasses allow you to specify a parent when you instantiate a new class loader. If you don&amp;rsquo;t explicitly specify a parent, the virtual machine&amp;rsquo;s system class loader will be assigned as the default parent.&lt;/li&gt;
&lt;li&gt;The loadClass method in ClassLoader performs these tasks, in order, when called to load a class:
&lt;ul&gt;
&lt;li&gt;If a class has already been loaded, it returns it.&lt;/li&gt;
&lt;li&gt;Otherwise, it delegates the search for the new class to the parent class loader.&lt;/li&gt;
&lt;li&gt;If the parent class loader does not find the class, loadClass calls the method findClass to find and load the class.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The findClass method of ClassLoader searches for the class in the current class loader if the class wasn&amp;rsquo;t found by the parent class loader. You will probably want to override this method when you instantiate a class loader subclass in your application.&lt;/li&gt;
&lt;li&gt;The class java.net.URLClassLoader serves as the basic class loader for extensions and other JAR files, overriding the findClass method of java.lang.ClassLoader to search one or more specified URLs for classes and resources.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://docs.oracle.com/cd/E19501-01/819-3659/images/dgdeploy2.gif&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;		System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Day44.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getClassLoader&lt;/span&gt;());
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(String.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getClassLoader&lt;/span&gt;());
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jdk.internal.loader.ClassLoaders$AppClassLoader@512ddf17
null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;here the class &lt;code&gt;Day44&lt;/code&gt; will be loaded by &lt;code&gt;ApplicationClassLoader&lt;/code&gt; and String is loaded by &lt;code&gt;BootStrapClassLoader&lt;/code&gt; A bootstrap or primordial class loader is the parent of all the others.Though, we can see that for the String, it displays null in the output. This is because the bootstrap class loader is written in native code, not Java, so it doesn&amp;rsquo;t show up as a Java class.&lt;/p&gt;
&lt;h4 id=&#34;linking&#34;&gt;Linking:&lt;/h4&gt;
&lt;p&gt;After a class is located and its initial in-memory representation created in the JVM process, it is verified, prepared, resolved, and initialized.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;makes sure that the class is not corrupted and is structurally correct: its runtime constant pool is valid, the types of variables are correct, and the variables are initialized prior to being accessed. Verification can be turned off by supplying the &lt;code&gt;-noverify&lt;/code&gt; option. If the JVM process does not run potentially malicious code, strict verification might not be required. Turning off the verification can speed up the startup of the JVM. Another benefit is that some classes, especially those generated on the fly by various tools, can be valid and safe for the JVM but unable to pass the strict verification process. In order to use such tools, the developer should disable this verification, which is often acceptable to do in a development environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preparation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;of a class involves initializing its static fields to the default values for their respective types. After preparation, fields of type &lt;code&gt;int&lt;/code&gt; contain &lt;code&gt;0&lt;/code&gt;, references are null, and so forth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resolution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;of a class means checking that the symbolic references in the runtime constant pool actually point to valid classes of the required types. The resolution of a symbolic reference triggers loading of the referenced class. According to the JVM specification, this resolution process can be performed lazily, so it is deferred until the class is used.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;initialization&#34;&gt;Initialization&lt;/h4&gt;
&lt;p&gt;Initialization expects a prepared and verified class. It runs the class’s &lt;code&gt;initializer&lt;/code&gt;. During initialization, the static fields are initialized to whatever values are specified in the code. The static initializer method that combines the code from all the static initialization blocks is also run. The initialization process should be run only once for every loaded class, so it is synchronized, especially because the initialization of the class can trigger the initialization of other classes and should be performed with care to avoid deadlocks.&lt;/p&gt;
&lt;h3 id=&#34;runtime-data-areas&#34;&gt;Runtime Data Areas:&lt;/h3&gt;
&lt;p&gt;Runtime data areas consist of&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Heap Area&lt;/li&gt;
&lt;li&gt;Method Area&lt;/li&gt;
&lt;li&gt;Stack Area&lt;/li&gt;
&lt;li&gt;PC Registers&lt;/li&gt;
&lt;li&gt;Native Method Stack&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;heap-area&#34;&gt;Heap Area:&lt;/h4&gt;
&lt;p&gt;The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated. The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated.&lt;/p&gt;
&lt;p&gt;Heap Memory can be accessed by any thread is further divided into three generations &lt;strong&gt;Young Generation&lt;/strong&gt;, &lt;strong&gt;Old&lt;/strong&gt; &amp;amp; &lt;strong&gt;PermGen(Permanent Generation)&lt;/strong&gt;. When object is created then it first go to Young generation(especially Eden space) when objects get old then it moves to Old/tenured Generation. In PermGen space all static &amp;amp; instance variables name-value pairs(name-references for object) are stored. Below is image showing heap structure of java.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://i.stack.imgur.com/ZzVu5.png&#34; alt=&#34;&#34;  /&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.jvmhost.com/articles/how-can-i-monitor-memory-usage-of-my-tomcat-jvm/jvm_memory_diagram1.png&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;You can manually increase heap size by some JVM parameters as shown in images. Suppose we have a simple class Day44 then increasing its memory by following parameters:-&lt;/p&gt;
&lt;p&gt;There are types of heap memory spaces like eden , tenured and old spaces&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;java -Xms=1M -XmX=2M Day44
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;stack-area&#34;&gt;Stack Area:&lt;/h4&gt;
&lt;p&gt;Stack is generated with each thread created by program. It is associated by thread. Each Thread has its own stack. All local variables &amp;amp; function calls are stored in stack. It’s life depends upon Thread’s life as thread will be alive it will also and vice-versa. It can also be increased by manually:-&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;java -Xss=512M Day44
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It throws StackOverFlow error when stack get full.&lt;/p&gt;
&lt;h4 id=&#34;method-area&#34;&gt;Method Area:&lt;/h4&gt;
&lt;p&gt;It is memory which is shared among all Threads like Heap. It is created on Java Virtual Machine startup. It contains the code actually a compiled code, methods and its data and fields. &lt;strong&gt;Runtime constant pool&lt;/strong&gt; is also a part of Method Area. Runtime Constant pool is per class representation of constant Table. It contains all literals defined at compiled time and references which is going to be solved at runtime. Memory for it is by default allotted by JVM and can be increased if needed.&lt;/p&gt;
&lt;h4 id=&#34;native-method-stack&#34;&gt;Native Method Stack:&lt;/h4&gt;
&lt;p&gt;An implementation of the Java Virtual Machine may use conventional stacks, also called &amp;ldquo;C stacks,&amp;rdquo; to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine&amp;rsquo;s instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.&lt;/p&gt;
&lt;h3 id=&#34;execution-engine&#34;&gt;Execution Engine&lt;/h3&gt;
&lt;p&gt;Execution Engine helps in executing the byte code by converting it into machine code and also interact with the memory area. So here are the components involved in executing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interpreter&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;It is responsible to read, interpret, and execute java program line by line. So if any method is called multiple times new interpretation required which is the main disadvantage of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JIT Compiler (Just In Time):&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When we compile our Java program (e.g., using the &lt;em&gt;javac&lt;/em&gt; command), we&amp;rsquo;ll end up with our source code compiled into the binary representation of our code – a JVM bytecode&lt;/strong&gt;. This bytecode is simpler and more compact than our source code, but conventional processors in our computers cannot execute it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To be able to run a Java program, the JVM interprets the bytecode&lt;/strong&gt;. Since interpreters are usually a lot slower than native code executing on a real processor, the &lt;strong&gt;JVM can run another compiler which will now compile our bytecode into the machine code that can be run by the processor&lt;/strong&gt;. This so-called just-in-time compiler is much more sophisticated than the &lt;em&gt;javac&lt;/em&gt; compiler, and it runs complex optimizations to generate high-quality machine code&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The JDK implementation by Oracle is based on the open-source OpenJDK project. This includes the &lt;strong&gt;HotSpot virtual machine&lt;/strong&gt;, available since Java version 1.3. It &lt;strong&gt;contains two conventional JIT-compilers: the client compiler, also called C1 and the server compiler, called opto or C2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C1 is designed to run faster and produce less optimized code, while C2, on the other hand, takes a little more time to run but produces a better-optimized code. The client compiler is a better fit for desktop applications since we don&amp;rsquo;t want to have long pauses for the JIT-compilation. The server compiler is better for long-running server applications that can spend more time on the compilation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intermediate Code Generator&lt;/li&gt;
&lt;li&gt;Code Optimizer&lt;/li&gt;
&lt;li&gt;Target Code Generator&lt;/li&gt;
&lt;li&gt;Profiler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: Profiler is there to identify hotspot repeated methods inside JIT.&lt;/p&gt;
&lt;p&gt;In order to provide native libraries to the Execution Engine, we have JNI that connects with Native libraries and the Execution Engine.&lt;/p&gt;
&lt;p&gt;In the next part will discuss about what is runtime and java runtime environment&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 43: learning about the internals of jre, jvm (Part 1)</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day43/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day43/</id>
    <published>2022-02-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Understating the internals of jre and jvm how does they work to run a java program</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;First of all here inside out approach is followed to understand JVM then JRE and then JDK and along the path will try to explain Virtualization, Hypervisor, VM, various kind of VM, runtime, java program execution model and memory model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;N.B JVM is a specification and it have many implementations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When we talk about JVM aka java virtual machine. So lets first understand what is virtual machine. To understand whats a virtual machine is we need to have some basic knowledge of key technologies like virtualization and hypervisor.&lt;/p&gt;
&lt;h3 id=&#34;virtualization&#34;&gt;Virtualization:&lt;/h3&gt;
&lt;p&gt;Virtualization is the process of running a virtual instance of a computer system in a layer (Hypervisor) up from the actual hardware. Most commonly, it refers to running multiple operating systems on a computer system simultaneously. To the applications running on top of the virtualized machine, it can appear as if they are on their own dedicated machine, where the operating system, libraries, and other programs are unique to the guest virtualized system and unconnected to the host operating system which sits below it.&lt;/p&gt;
&lt;h3 id=&#34;hypervisorvmm&#34;&gt;Hypervisor(VMM):&lt;/h3&gt;
&lt;p&gt;A hypervisor aka VMM( Virtual Machine monitor) is a program for creating and running virtual machines. Hypervisors have traditionally been split into two classes: type one, or &amp;ldquo;bare metal&amp;rdquo; hypervisors that run guest virtual machines directly on a system&amp;rsquo;s hardware, essentially behaving as an operating system. Type two, or &amp;ldquo;hosted&amp;rdquo; hypervisors behave more like traditional applications that can be started and stopped like a normal program. In modern systems, this split is less prevalent, particularly with systems like KVM. KVM, short for kernel-based virtual machine, is a part of the Linux kernel that can run virtual machines directly, although you can still use a system running KVM virtual machines as a normal computer itself.&lt;/p&gt;
&lt;h3 id=&#34;virtual-machine&#34;&gt;Virtual Machine:&lt;/h3&gt;
&lt;p&gt;A virtual machine is the emulated equivalent of a computer system that runs on top of another system. Virtual machines may have access to any number of resources:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;computing power, through hardware-assisted&lt;/li&gt;
&lt;li&gt;Limited access to the host machine&amp;rsquo;s CPU and memory&lt;/li&gt;
&lt;li&gt;one or more physical or virtual disk devices for storage&lt;/li&gt;
&lt;li&gt;A virtual or real network interface&lt;/li&gt;
&lt;li&gt;Other devices such as video cards, USB devices, or other hardware that are shared with the virtual machine.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the virtual machine is stored on a virtual disk, this is often referred to as a disk image. A disk image may contain the files for a virtual machine to boot, or, it can contain any other specific storage needs.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.brainkart.com/imagebk12/FTtnlOD.jpg&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;There are many type of VM and many layers where virtualization can be done and they are&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://img.brainkart.com/imagebk12/oJDo3bd.jpg&#34; alt=&#34;&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;There are five layers where virtualization can be possible. For understanding JVM (Java virtual Machine) that is a application level vm.&lt;/p&gt;
&lt;h3 id=&#34;application-level-virtualization&#34;&gt;Application Level Virtualization:&lt;/h3&gt;
&lt;p&gt;Virtualization at the application level virtualizes an application as a VM. On a OS, an application often runs as a process. Therefore, application-level virtualization is also known as process-level virtualization. The most popular approach is to deploy high level language (HLL)VMs.&lt;/p&gt;
&lt;p&gt;In this scenario, the virtualization layer sits as an application program on top of the operating system, and the layer behaves like a VM that have the normal properties of an VM and can run programs written and compiled to a particular machine definition for that virtual machine. Any program written in the HLL and compiled for this VM will be able to run on it. The Microsoft .NET CLR and Java Virtual Machine (JVM) are two good examples of this class of VM.&lt;/p&gt;
&lt;p&gt;Other forms of application level virtualization are known as application isolation, application sandboxing, or application streaming. This process involves wrapping up the application in a layer that is isolated from the host OS and other applications. The result is an application that is much easier to distribute and remove from user workstations.&lt;/p&gt;
&lt;p&gt;So now as JVM is an application that behaves like a virtual machine it has its own architecture.&lt;/p&gt;
&lt;h3 id=&#34;jvm&#34;&gt;JVM:&lt;/h3&gt;
&lt;p&gt;Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to bytecode. The JVM is detailed by a specification that formally describes what is required in a JVM implementation. Having a specification ensures interoperability of Java programs across different implementations so that program authors using the Java Development Kit (JDK) need not worry about idiosyncrasies of the underlying hardware platform.&lt;/p&gt;
&lt;p&gt;JVM has some important tasks to perform and those are&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Loading Code&lt;/li&gt;
&lt;li&gt;Verifying Code&lt;/li&gt;
&lt;li&gt;Executing Code&lt;/li&gt;
&lt;li&gt;Providing Runtime Environment&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;JVM Architecuture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.javainterviewpoint.com/java-virtual-machine-architecture-in-java/jvm-architecture/&#34; alt=&#34;The JVM Architecture Explained - DZone Java&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;In Part 2 details discussion about JVM will be posted&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 42: using custom annotations and check if its a class level or field level annotation</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day42/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day42/</id>
    <published>2022-02-11T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">implementing custom annotations and check if its a class level or field level annotation.</summary>
    <content type="html">&lt;p&gt;Annotations are type of metadata ( data that provides information about other data) provide data about a program that is not part of the program itself. They don&amp;rsquo;t have any effect on operations of the program.&lt;/p&gt;
&lt;p&gt;implemented two custom annotation one for Class level named &lt;code&gt;ClassLevelAnnotation&lt;/code&gt; and another one is Field level named &lt;code&gt;FieldLevelAnnotation&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;	&lt;span style=&#34;color:#ffa500&#34;&gt;@Retention&lt;/span&gt;(RetentionPolicy.&lt;span style=&#34;color:#bbb&#34;&gt;RUNTIME&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Target&lt;/span&gt;(ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;TYPE&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@interface&lt;/span&gt; ClassLevelAnnotation {
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Retention&lt;/span&gt;(RetentionPolicy.&lt;span style=&#34;color:#bbb&#34;&gt;RUNTIME&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@Target&lt;/span&gt;(ElementType.&lt;span style=&#34;color:#bbb&#34;&gt;FIELD&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@interface&lt;/span&gt; FieldLevelAnnotation {
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;retention&#34;&gt;Retention:&lt;/h4&gt;
&lt;p&gt;It declares the availability of the annotation. if its given &lt;code&gt;RetentionPolicy.RUNTIME&lt;/code&gt; that means it will be available in the runtime. If no retention policy is there then it takes the default retention policy which is &lt;code&gt;RetentionPolicy.CLASS&lt;/code&gt; that means the annotation will be stored in the class file but not be available at the runtime.&lt;/p&gt;
&lt;h4 id=&#34;target&#34;&gt;Target:&lt;/h4&gt;
&lt;p&gt;It gives the option to declare which java elements the custom annotation can be used to annotate. &lt;code&gt;ElementType.TYPE&lt;/code&gt; means it targets a class type and can be used to annotate class. &lt;code&gt;ElementType.FIELD&lt;/code&gt; means it targets a class&amp;rsquo;s field and can be used to annotate it.&lt;/p&gt;
&lt;p&gt;Here in this code there is another type of annotation that is &lt;code&gt;ElementType.ANNOTATION_TYPE&lt;/code&gt; which is used to annotate another annotation. For example in the implementation the &lt;code&gt;@Target&lt;/code&gt; and &lt;code&gt;@Retention&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now the annotations are placed on a class&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#ffa500&#34;&gt;@ClassLevelAnnotation&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;AnotherClass&lt;/span&gt; {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@FieldLevelAnnotation&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; firstNumber;
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;now in the main class there are two methods implemented to check if the class is annotated with a class level annotation and a field is annotated with a field level annotation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day42&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchFieldException {
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(isAnnotatedClass(AnotherClass.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(isAnnotatedField(AnotherClass.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;,&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;firstNumber&amp;#34;&lt;/span&gt;));
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isAnnotatedField&lt;/span&gt;(Class&amp;lt;?&amp;gt; clasz, String fieldName) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; NoSuchFieldException {
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; clasz.&lt;span style=&#34;color:#bbb&#34;&gt;getDeclaredField&lt;/span&gt;(fieldName).&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(FieldLevelAnnotation.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    }

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isAnnotatedClass&lt;/span&gt;(Class&amp;lt;?&amp;gt; clasz) {
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; clasz.&lt;span style=&#34;color:#bbb&#34;&gt;isAnnotationPresent&lt;/span&gt;(ClassLevelAnnotation.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in &lt;code&gt;isAnnotatedField()&lt;/code&gt; it takes a &lt;code&gt;class&lt;/code&gt; and the &lt;code&gt;fieldName&lt;/code&gt; that needs to be checked if it had annotation on it. &lt;code&gt;isAnnotatedClass()&lt;/code&gt; takes a class and checks if any annotations are present on that class using the &lt;code&gt;java.lang.Class&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 41: Generating unique id&#39;s based on device MAC address and epoch time</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day41/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day41/</id>
    <published>2022-02-03T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Generating unique id&amp;rsquo;s based on device MAC address and epoch time</summary>
    <content type="html">&lt;p&gt;Generating unique id&amp;rsquo;s based on device MAC address and default timezone epoch time of given or a default time. These id&amp;rsquo;s can be generated in multiple machines as device mac address is used to create the id.&lt;/p&gt;
&lt;p&gt;64 bit Id format is&lt;br&gt;
&lt;strong&gt;Epoch Time&lt;/strong&gt; - (&lt;strong&gt;41 bits&lt;/strong&gt;) is used of epoch time and added to the id creation process. Max timestamp that can be represented is 2^41&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Machine Id&lt;/strong&gt; - (&lt;strong&gt;10 bits&lt;/strong&gt;) machine id is calculated from MAC address and as 10 bits considered so max machines allowed will be 2^10&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local counter per machine&lt;/strong&gt;: &lt;strong&gt;sequence bits&lt;/strong&gt; (&lt;strong&gt;12 bits&lt;/strong&gt;) are a local counter for each machines. Max value would be 2 ^ 12.&lt;/p&gt;
&lt;p&gt;The one remaining sign bit is remained and its set to 0&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CustomUIDSupplier&lt;/code&gt; class is a &lt;code&gt;Supplier&amp;lt;Long&amp;gt;&lt;/code&gt; that provides the long id&amp;rsquo;s.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;  9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 75
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 76
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 77
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 78
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 79
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 80
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 81
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 82
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 83
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 84
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 85
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 86
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 87
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 88
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 89
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 90
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 91
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 92
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 93
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 94
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 95
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 96
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 97
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 98
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 99
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;100
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;101
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;102
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;103
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CustomUIDSupplier&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Supplier&amp;lt;Long&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; MACHINE_MAC_ID_BITS = 10;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; SEQUENCE_BITS = 12;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxMachineID 
        = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;)(Math.&lt;span style=&#34;color:#bbb&#34;&gt;pow&lt;/span&gt;(2, MACHINE_MAC_ID_BITS) - 1);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxSequence 
        = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;)(Math.&lt;span style=&#34;color:#bbb&#34;&gt;pow&lt;/span&gt;(2, SEQUENCE_BITS) - 1);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; CUSTOM_EPOCH =
                LocalDateTime
                .&lt;span style=&#34;color:#bbb&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;2012-01-01T00:00:00&amp;#34;&lt;/span&gt;, DateTimeFormatter.&lt;span style=&#34;color:#bbb&#34;&gt;ISO_LOCAL_DATE_TIME&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;atZone&lt;/span&gt;(ZoneId.&lt;span style=&#34;color:#bbb&#34;&gt;systemDefault&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;toInstant&lt;/span&gt;()
				.&lt;span style=&#34;color:#bbb&#34;&gt;toEpochMilli&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; machineMacId;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; lastTimestamp = -1L;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; sequence = 0L;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;CustomUIDSupplier&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; machineMacId) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt;(machineMacId &amp;lt; 0 || machineMacId &amp;gt; maxMachineID) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; IllegalArgumentException(String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;NodeId must be between %d and %d&amp;#34;&lt;/span&gt;, 0, maxMachineID));
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;machineMacId&lt;/span&gt; = machineMacId;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;CustomUIDSupplier&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;machineMacId&lt;/span&gt; = createNodeId();
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Get current timestamp in milliseconds, adjust for the custom epoch.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;timestamp&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; customEpoch) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; epochInThisMoment = Instant.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toEpochMilli&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (customEpoch != 0)
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;  epochInThisMoment - customEpoch;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; epochInThisMoment;
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Block and wait till next millisecond
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;waitNextMillis&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; currentTimestamp) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (currentTimestamp == lastTimestamp) {
                currentTimestamp = timestamp(CUSTOM_EPOCH);
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; currentTimestamp;
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;createNodeId&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; machineMacId;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                StringBuilder sb = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; StringBuilder();
                Enumeration&amp;lt;NetworkInterface&amp;gt; networkInterfaces = NetworkInterface.&lt;span style=&#34;color:#bbb&#34;&gt;getNetworkInterfaces&lt;/span&gt;();
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;while&lt;/span&gt; (networkInterfaces.&lt;span style=&#34;color:#bbb&#34;&gt;hasMoreElements&lt;/span&gt;()) {
                    NetworkInterface networkInterface = networkInterfaces.&lt;span style=&#34;color:#bbb&#34;&gt;nextElement&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] mac = networkInterface.&lt;span style=&#34;color:#bbb&#34;&gt;getHardwareAddress&lt;/span&gt;();
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (mac != &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;) {
                        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; mac.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;; i++) {
                            sb.&lt;span style=&#34;color:#bbb&#34;&gt;append&lt;/span&gt;(String.&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;%02X&amp;#34;&lt;/span&gt;, mac[i]));
                        }
                    }
                }
                machineMacId = sb.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception ex) {
                machineMacId = (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SecureRandom().&lt;span style=&#34;color:#bbb&#34;&gt;nextInt&lt;/span&gt;());
            }
            machineMacId = machineMacId &amp;amp; maxMachineID;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; machineMacId;
        }


        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Long &lt;span style=&#34;color:#447fcf&#34;&gt;get&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; nextId();
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;nextId&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; currentTimestamp = timestamp(CUSTOM_EPOCH);

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt;(currentTimestamp &amp;lt; lastTimestamp) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; IllegalStateException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Invalid TimeStamp!&amp;#34;&lt;/span&gt;);
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (currentTimestamp == lastTimestamp) {
                sequence = (sequence + 1) &amp;amp; maxSequence;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt;(sequence == 0) {
                    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Sequence Exhausted, wait till next millisecond.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                    currentTimestamp = waitNextMillis(currentTimestamp);
                }
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// reset sequence to start with zero for the next millisecond
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                sequence = 0;
            }

            lastTimestamp = currentTimestamp;

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; id = currentTimestamp &amp;lt;&amp;lt; (MACHINE_MAC_ID_BITS + SEQUENCE_BITS);
            id |= ((&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt;) machineMacId &amp;lt;&amp;lt; SEQUENCE_BITS);
            id |= sequence;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; id;
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In &lt;code&gt;CustomerUIDSupplier&lt;/code&gt; class custom epoch is passed or calculated along with machine id that can also be passed in the constructor. &lt;code&gt;SecureRandom&lt;/code&gt; is used in case the machine id can not be calculated.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nextId()&lt;/code&gt; which in turn is called inside &lt;code&gt;get()&lt;/code&gt; of the supplier is calculated based on the sequence and timestamps and machine&amp;rsquo;s mac based id&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day41&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        CustomUIDSupplier customUIDSupplier = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CustomUIDSupplier();
        Stream&amp;lt;Long&amp;gt; longStream = Stream.&lt;span style=&#34;color:#bbb&#34;&gt;generate&lt;/span&gt;(customUIDSupplier);
        longStream.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;(10).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in the &lt;code&gt;main()&lt;/code&gt; a stream is generated from supplier that will in turn provide the unique id&amp;rsquo;s and then 10 of the id&amp;rsquo;s are taken and printed&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 40: Generator implementation using custom Iterator and Threads. </title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day40/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day40/</id>
    <published>2022-01-27T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">A python like generator implementation using custom Iterator, Thread and ThreadGroup</summary>
    <content type="html">&lt;p&gt;In one of my previous &lt;a href=&#34;https://www.linkedin.com/posts/mohibulhassan_100daysofjava-100daysofcode-coding-activity-6862015601217536000-iRvw&#34;&gt;post&lt;/a&gt; i tired to make python like generator in java using &lt;code&gt;Supplier&lt;/code&gt; function and &lt;code&gt;IntStream&lt;/code&gt;. That didnt fully behaved like a generator. So tried implementing this time using custom &lt;code&gt;Iterator&lt;/code&gt; for lazy evaluation of the items in the collections and using a &lt;code&gt;Thread&lt;/code&gt; to produce the items that will be &lt;code&gt;yield&lt;/code&gt; when calling the generator.&lt;/p&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/IdealLankySymbol?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;in this repl you can execute the generator named &lt;code&gt;InfiniteGenerator&lt;/code&gt; which extended an &lt;code&gt;abstract&lt;/code&gt; class &lt;code&gt;Generator&amp;lt;T&amp;gt;&lt;/code&gt; which in turn implements &lt;code&gt;Iterable&amp;lt;T&amp;gt;&lt;/code&gt; to implement a custom iterator of a given type. Any class implementing &lt;code&gt;Generator&amp;lt;T&amp;gt;&lt;/code&gt; class will be able to act like an generator if a given implementation that provides with items.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 39: Local date time to UTC date time and vice versa with respect to timezone and Day light saving</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day39/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day39/</id>
    <published>2022-01-21T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Converting LocalDateTime to UTC and vice versa with respect to timezone and Day Light saving time.</summary>
    <content type="html">&lt;p&gt;I faced some issues while working with &lt;code&gt;LocalDateTime&lt;/code&gt; and converting localdatetime to UTC and vice versa. Thats why created a method that takes &lt;code&gt;LocalDateTime&lt;/code&gt; Object and converts it to UTC date time or UTC date time to local date time of the timzone thats the JVM is in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; ZoneOffset &lt;span style=&#34;color:#447fcf&#34;&gt;getTimeZoneOffset&lt;/span&gt;(LocalDateTime dateTime) {
        TimeZone zone = TimeZone.&lt;span style=&#34;color:#bbb&#34;&gt;getDefault&lt;/span&gt;();
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// translate DayOfWeek values to Calendar&amp;#39;s
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; dayOfWeek;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (dateTime.&lt;span style=&#34;color:#bbb&#34;&gt;getDayOfWeek&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;() == 7) {
            dayOfWeek = 1;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; {
            dayOfWeek = dateTime.&lt;span style=&#34;color:#bbb&#34;&gt;getDayOfWeek&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;() + 1;
        }
&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get the offset used in the timezone, at the specified date
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//        int offset = zone.getOffset(1, now.getYear(), now.getMonthValue() - 1,
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;//                now.getDayOfMonth(), dayOfWeek, now.getNano() / 1000000);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; offset = 0;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (zone.&lt;span style=&#34;color:#bbb&#34;&gt;useDaylightTime&lt;/span&gt;()) {
            offset = zone.&lt;span style=&#34;color:#bbb&#34;&gt;getDSTSavings&lt;/span&gt;();
        }
        offset = zone.&lt;span style=&#34;color:#bbb&#34;&gt;getRawOffset&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; ZoneOffset.&lt;span style=&#34;color:#bbb&#34;&gt;ofTotalSeconds&lt;/span&gt;(offset / 1000);
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;in this &lt;code&gt;getTimeZoneOffset()&lt;/code&gt; using the &lt;code&gt;LocalDateTime&lt;/code&gt; and &lt;code&gt;TimeZone.getDefault()&lt;/code&gt; which in turns will get the default timezone from the jvm instance. &lt;code&gt;zone.getRawOffset()&lt;/code&gt; of TimeZone class will return the raw offset.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&#34;raw-offset&#34;&gt;Raw Offset:&lt;/h4&gt;
&lt;p&gt;Returns the amount of time in milliseconds to add to UTC to get standard time in this time zone. Because this value is not affected by daylight saving time, it is called raw offset.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;h4 id=&#34;dst-savings&#34;&gt;DST Savings:&lt;/h4&gt;
&lt;p&gt;Returns the amount of time to be added to local standard time to get local wall clock time.
The default implementation returns 3600000 milliseconds (i.e., one hour) if a call to 	&lt;code&gt;useDaylightTime()&lt;/code&gt; returns true. Otherwise, 0 (zero) is returned.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then using the &lt;code&gt;getTimeZoneOffset()&lt;/code&gt; to calculate the local to UTC also UTC to local time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; LocalDateTime &lt;span style=&#34;color:#447fcf&#34;&gt;localToUTCViceVersa&lt;/span&gt;(
    LocalDateTime localDatTime, ZoneOffset offset, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; switcher) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt;  localDatTime
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// convert to timezone&amp;#39;s offset (local -&amp;gt; UTC)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// or convet to UTC (UTC -&amp;gt; local)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                .&lt;span style=&#34;color:#bbb&#34;&gt;atOffset&lt;/span&gt;(switcher ? offset : ZoneOffset.&lt;span style=&#34;color:#bbb&#34;&gt;UTC&lt;/span&gt;)
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// convert to UTC (local -&amp;gt; UTC)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// or convert to TimeZone offset (UTC -&amp;gt; local)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                .&lt;span style=&#34;color:#bbb&#34;&gt;withOffsetSameInstant&lt;/span&gt;(switcher ? ZoneOffset.&lt;span style=&#34;color:#bbb&#34;&gt;UTC&lt;/span&gt; : offset)
                &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get LocalDateTime
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;                .&lt;span style=&#34;color:#bbb&#34;&gt;toLocalDateTime&lt;/span&gt;();
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;h4 id=&#34;withoffsetsameinstant-&#34;&gt;withOffsetSameInstant() :&lt;/h4&gt;
&lt;p&gt;Returns a copy of this OffsetDateTime with the specified offset ensuring that the result is at the same instant.
This method returns an object with the specified ZoneOffset and a LocalDateTime adjusted by the difference between the two offsets. This will result in the old and new objects representing the same instant. This is useful for finding the local time in a different offset. For example, if this time represents 2007-12-03T10:30+02:00 and the offset specified is +03:00, then this method will return 2007-12-03T11:30+03:00&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;in &lt;code&gt;localToUTCViceVersa()&lt;/code&gt; which takes a LocalDateTime and ZoneOffset and a switcher to switch to local -&amp;gt; UTC or UTC -&amp;gt; local. which takes the offset and makes the &lt;code&gt;OffsetDateTime&lt;/code&gt; and then using the &lt;code&gt;withOffsetSameInstant()&lt;/code&gt; we get local date time in the local time zone or in UTC.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 37: Feature toggle to enable disable features for paid and unpaid user</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day37/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day37/</id>
    <published>2022-01-05T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Feature toggle service to enable disable any feature for paid and unpaid users</summary>
    <content type="html">&lt;p&gt;Feature toggle is used to easily enable and disable features for some group of users of the applications.  Here &lt;code&gt;Usergroup.java&lt;/code&gt; is used to define the user groups which are free and paid users.
&lt;code&gt;TieredFeatureToggle.java&lt;/code&gt; uses this paid user information to show custom messsage to paid users.&lt;/p&gt;
&lt;p&gt;Here is the example.&lt;/p&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/UpbeatHappyProgramminglanguages?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
</content>
  </entry>
  <entry>
    <title>Day 38: One of the cases to use check and unchecked exceptions</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day38/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day38/</id>
    <published>2022-01-05T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">One of the case where to use checked and another for unchecked exceptions</summary>
    <content type="html">&lt;h4 id=&#34;checked-exceptions&#34;&gt;Checked Exceptions:&lt;/h4&gt;
&lt;p&gt;Exceptions that are checked during the compile time are called the checked exception. Basically compiler check for the exception to verify that a method or class that is throwing the exception have code that have given the code contingency. A way of handling with try-catch.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;File file = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; File(&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;#34;&lt;/span&gt;/path/of/a/non/existing/file);
FileInputStream fileInputStream = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileInputStream(file);
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For example, here when instantiating &lt;code&gt;File&lt;/code&gt; object if the file is not present then it throws &lt;code&gt;FileNotFoundException&lt;/code&gt; and its super class is &lt;code&gt;Exception&lt;/code&gt; class which is checked at compile time.&lt;/p&gt;
&lt;h4 id=&#34;unchecked-exceptions&#34;&gt;Unchecked Exceptions:&lt;/h4&gt;
&lt;p&gt;Exceptions that are not checked during compile time are called unchecked exceptions. These exceptions occurs in run time.Furthermore, we don&amp;rsquo;t have to declare unchecked exceptions in a method with the throws keyword. Some common unchecked exceptions in Java are &lt;code&gt;NullPointerException&lt;/code&gt;, &lt;code&gt;ArrayIndexOutOfBoundsException&lt;/code&gt; and &lt;code&gt;IllegalArgumentException&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;divideByZero&lt;/span&gt;() {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; numerator = 1;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; denominator = 0;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; result = numerator / denominator;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For example, here when result is calculated it casues &lt;code&gt;ArithmaticException&lt;/code&gt; which is a runtime exception.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.oracleimg.com/technetwork/articles/entarch/javaexceptions-107916.jpg&#34; alt=&#34;Java Exception Hierarchy&#34;  /&gt;
&lt;/p&gt;
&lt;h4 id=&#34;when-to-use-checked-and-unchecked&#34;&gt;When to use Checked and Unchecked:&lt;/h4&gt;
&lt;p&gt;From Oracle Java Documentation provides guidance on when to use checked exceptions and unchecked exceptions:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;“If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.”&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 36: Learned about banned dependencies and how to ban transitive dependency in a maven or gradle project</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day36/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day36/</id>
    <published>2021-12-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Many 3rd party libraries can have vulnerable dependency like recently reported Log4j 2. so to ban them from getting resolved in your maven or gradle project you can use maven-enforcer plugin.</summary>
    <content type="html">&lt;p&gt;Last week &lt;strong&gt;CVE&lt;/strong&gt; (Common Vulnerabilities and Exposures) -2021-44228 in Apache Log4J logging library which is a &lt;strong&gt;RCE&lt;/strong&gt; (Remote Code Execution) class vulnerability was reported.&lt;br&gt;
Log4J is a popular logging library which is open sourced and used by many projects all over the tech space.&lt;/p&gt;
&lt;p&gt;Patch and resolvable techniques are already provided in many blogs and websites.&lt;/p&gt;
&lt;p&gt;Recently i learned about from banned dependencies from &lt;a href=&#34;https://twitter.com/gunnarmorling&#34;&gt;@gunnarmorling&amp;rsquo;s&lt;/a&gt; tweet . Maven&amp;rsquo;s enforcer plugin can ban certain dependencies using rules.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-enforcer-plugin&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.0.0&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;ban-vulnerable-log4j2-versions&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;validate&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;enforce&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;rules&amp;gt;&lt;/span&gt;
              &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;bannedDependencies&amp;gt;&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;excludes&amp;gt;&lt;/span&gt;
                  &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;org.apache.logging.log4j:log4j-core:(,2.15.0)&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/excludes&amp;gt;&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;message&amp;gt;&lt;/span&gt;Maven error because -&amp;gt; log4j is vulnerable to remote code execution&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
              &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/bannedDependencies&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/rules&amp;gt;&lt;/span&gt;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;fail&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/fail&amp;gt;&lt;/span&gt;
          &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
      &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;here &lt;code&gt;&amp;lt;bannedDependencies&amp;gt;&lt;/code&gt; rule enforces to exclude any log4j dependency to get excluded if its not 2.15.0 or greater. searchTransitive is by default true so it will check transitive dependencies and apply this rule for them.&lt;/p&gt;
&lt;p&gt;On gradle there are constraints that can help to do similar rule enforcement for excluding vulnerable dependencies from project. That i learned from &lt;a href=&#34;https://twitter.com/CedricChampeau&#34;&gt;@CedricChampeau&lt;/a&gt; tweet.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-gradle&#34; data-lang=&#34;gradle&#34;&gt;dependencies {
	constraints {
    	implementations (&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;org.apache.logging.log4j:log4j-core&amp;#34;&lt;/span&gt;) {
        	version {
            	strictly(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;[2.15,3[&amp;#34;&lt;/span&gt;)
                prefer(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;2.15.0&amp;#34;&lt;/span&gt;)
            }
            because(&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&amp;#34;&lt;/span&gt;Maven error because -&amp;gt; log4j is vulnerable to remote code execution)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Day 35: Emulating Pair in java using AbstractMap.SimpleEntry&lt;&gt;() and new Object() {} implementation</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day35/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day35/</id>
    <published>2021-12-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Pair behavior in java</summary>
    <content type="html">&lt;p&gt;While working need a structure like Pair in java so tired to emulate the behavior using AbstractMap.SimpleEntry&amp;lt;&amp;gt;() and a technique shared by &lt;a href=&#34;https://twitter.com/starbuxman/status/1449685459492212740&#34;&gt;@starbuxman &lt;/a&gt;in his tweet about creating tuple using new Object(){} implementation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day35&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        DoubleStream doubleStream = DoubleStream.&lt;span style=&#34;color:#bbb&#34;&gt;iterate&lt;/span&gt;(1.&lt;span style=&#34;color:#bbb&#34;&gt;0&lt;/span&gt; , d -&amp;gt; d+0.&lt;span style=&#34;color:#bbb&#34;&gt;5&lt;/span&gt;);

        List&amp;lt;AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;Double, Double&amp;gt;&amp;gt; pairs =  doubleStream
                .&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;(10)
                .&lt;span style=&#34;color:#bbb&#34;&gt;mapToObj&lt;/span&gt;(number -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; AbstractMap.&lt;span style=&#34;color:#bbb&#34;&gt;SimpleEntry&lt;/span&gt;&amp;lt;&amp;gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random().&lt;span style=&#34;color:#bbb&#34;&gt;nextDouble&lt;/span&gt;(), number))
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());

        pairs.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(pair -&amp;gt; {
          System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(pair.&lt;span style=&#34;color:#bbb&#34;&gt;getKey&lt;/span&gt;());
          System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(pair.&lt;span style=&#34;color:#bbb&#34;&gt;getValue&lt;/span&gt;());
        });

        Stream.&lt;span style=&#34;color:#bbb&#34;&gt;generate&lt;/span&gt;(() -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random().&lt;span style=&#34;color:#bbb&#34;&gt;nextDouble&lt;/span&gt;())
              .&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;(10)
              .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(lon -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Object() {
                 &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; lattitude = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Random().&lt;span style=&#34;color:#bbb&#34;&gt;nextDouble&lt;/span&gt;();
                 &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;double&lt;/span&gt; longitude = lon;
              }).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(tuple -&amp;gt; {
                  System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(tuple.&lt;span style=&#34;color:#bbb&#34;&gt;lattitude&lt;/span&gt;);
                  System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(tuple.&lt;span style=&#34;color:#bbb&#34;&gt;longitude&lt;/span&gt;);
              });

    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Advent of Code Day 02</title>
    <link href="https://mohibulsblog.netlify.app/posts/adeventofcode2021/day02/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/adeventofcode2021/day02/</id>
    <published>2021-12-02T00:00:00Z</published>
    <updated>2021-12-06T06:09:08Z</updated>
    <summary type="html">Listed here are the solutions of AOC2021 Day02 in Java, Rust, Go</summary>
    <content type="html">&lt;p&gt;Problem:  &lt;a href=&#34;https://adventofcode.com/2021/day/2&#34; title=&#34;https://adventofcode.com/2021/day/2&#34;&gt;https://adventofcode.com/2021/day/2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please for changing the code fork it in repl.it or copy&lt;/p&gt;
&lt;h3 id=&#34;java-solution&#34;&gt;Java Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventOfCodeDay02Java?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
&lt;h3 id=&#34;rust-solution&#34;&gt;Rust Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventOfCodeDay02Rust?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
&lt;h3 id=&#34;golang-solution&#34;&gt;Golang Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventOfCodeDay02Golang?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
</content>
  </entry>
  <entry>
    <title>Advent of Code Day 01</title>
    <link href="https://mohibulsblog.netlify.app/posts/adeventofcode2021/day01/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/adeventofcode2021/day01/</id>
    <published>2021-12-01T00:00:00Z</published>
    <updated>2021-12-06T06:08:58Z</updated>
    <summary type="html">Listed here are the solutions of AOC2021 Day01 in Java, Rust, Go</summary>
    <content type="html">&lt;p&gt;Problem:  &lt;a href=&#34;https://adventofcode.com/2021/day/1&#34; title=&#34;https://adventofcode.com/2021/day/1&#34;&gt;https://adventofcode.com/2021/day/1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please for changing the code fork it in repl.it or copy&lt;/p&gt;
&lt;h3 id=&#34;java-solution&#34;&gt;Java Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventOfCodeDay01Java?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
&lt;h3 id=&#34;rust-solution&#34;&gt;Rust Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventOfCodeRustDay01?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
&lt;h3 id=&#34;golang-solution&#34;&gt;Golang Solution&lt;/h3&gt;
&lt;iframe style=&#34;height: 500px; width: 100%; resize: both; overflow: auto;&#34; src=&#34;https://replit.com/@dhrubo55/AdventofCode01Go?lite=false&#34; scrolling=&#34;no&#34; frameborder=&#34;no&#34; allowtransparency=&#34;true&#34; allowfullscreen=&#34;true&#34; sandbox=&#34;allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals&#34;&gt;&lt;/iframe&gt;
</content>
  </entry>
  <entry>
    <title>Day 34: Inspecting JVM runtime memory and processor count with Runtime</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day34/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day34/</id>
    <published>2021-12-01T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Inspecting JVM runtime memory and available processor count with Runtime.getRuntime().</summary>
    <content type="html">&lt;p&gt;Inspecting JVM runtime memory and available processor count with &lt;code&gt;Runtime.getRuntime()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.apache.commons.io.FileUtils&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day34&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; availableCoreCountToJVM = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;availableProcessors&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; maxMemoryUsableToJVM = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;maxMemory&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; availableFreeMemoryInJVM = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;freeMemory&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; JVMTotalMemory = Runtime.&lt;span style=&#34;color:#bbb&#34;&gt;getRuntime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;totalMemory&lt;/span&gt;();

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Amount of max memory for JVM : &amp;#34;&lt;/span&gt;
            + FileUtils.&lt;span style=&#34;color:#bbb&#34;&gt;byteCountToDisplaySize&lt;/span&gt;(maxMemoryUsableToJVM));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Amount of total memory in JVM : &amp;#34;&lt;/span&gt;
            + FileUtils.&lt;span style=&#34;color:#bbb&#34;&gt;byteCountToDisplaySize&lt;/span&gt;(JVMTotalMemory));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Amount of free memory in JVM : &amp;#34;&lt;/span&gt;
            + FileUtils.&lt;span style=&#34;color:#bbb&#34;&gt;byteCountToDisplaySize&lt;/span&gt;(availableFreeMemoryInJVM));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Available CPU core count in JVM: &amp;#34;&lt;/span&gt; + availableCoreCountToJVM);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6871816250369175552/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day34.png&#34; alt=&#34;Day 34 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 33: Getting a programmer joke asynchronously with CompletableFuture, HttpClient, and Jackson</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day33/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day33/</id>
    <published>2021-11-25T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Getting a programmer joke asynchronously with CompletableFuture, HttpClient, and Jackson.</summary>
    <content type="html">&lt;p&gt;Getting a programmer joke asynchronously with &lt;code&gt;CompletableFuture&lt;/code&gt;, &lt;code&gt;HttpClient&lt;/code&gt;, and Jackson.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;62
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.fasterxml.jackson.annotation.JsonIgnoreProperties&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.fasterxml.jackson.annotation.JsonProperty&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.fasterxml.jackson.core.type.TypeReference&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;com.fasterxml.jackson.databind.ObjectMapper&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URI&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URISyntaxException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpClient&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpRequest&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpResponse&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.CompletableFuture&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.ExecutionException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.concurrent.TimeUnit&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.logging.Logger&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day33&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = Logger.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(Day33.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            String webSite = CompletableFuture.&lt;span style=&#34;color:#bbb&#34;&gt;supplyAsync&lt;/span&gt;(Day33::getWebSite)
                .&lt;span style=&#34;color:#bbb&#34;&gt;completeOnTimeout&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Emptiness itself is a joke&amp;#34;&lt;/span&gt;, 5, TimeUnit.&lt;span style=&#34;color:#bbb&#34;&gt;SECONDS&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();

            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Joke of the day: \n&amp;#34;&lt;/span&gt;);
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(webSite);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (ExecutionException | InterruptedException e) {
            logger.&lt;span style=&#34;color:#bbb&#34;&gt;severe&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Couldnt execute or got interrupted cause &amp;#34;&lt;/span&gt; + e);
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getWebSite&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            HttpClient httpClient = HttpClient.&lt;span style=&#34;color:#bbb&#34;&gt;newHttpClient&lt;/span&gt;();
            HttpRequest httpRequest = HttpRequest
                .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;uri&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; URI(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://v2.jokeapi.dev/joke/Programming?blacklistFlags=nsfw,religious,political,racist,sexist,explicit&amp;amp;type=single&amp;#34;&lt;/span&gt;))
                .&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;()
                .&lt;span style=&#34;color:#bbb&#34;&gt;header&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;)
                .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

            HttpResponse&amp;lt;String&amp;gt; response = httpClient.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(
                httpRequest,
                HttpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;BodyHandlers&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ofString&lt;/span&gt;()
            );

            String joke = response.&lt;span style=&#34;color:#bbb&#34;&gt;body&lt;/span&gt;();
            ObjectMapper mapper = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ObjectMapper();
            Joke jokeObj = mapper.&lt;span style=&#34;color:#bbb&#34;&gt;readValue&lt;/span&gt;(joke, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TypeReference&amp;lt;Joke&amp;gt;() {});
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; jokeObj.&lt;span style=&#34;color:#bbb&#34;&gt;joke&lt;/span&gt;;
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException | URISyntaxException | IOException e) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; RuntimeException(e);
        }
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@JsonIgnoreProperties&lt;/span&gt;(ignoreUnknown = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Joke&lt;/span&gt; {
        &lt;span style=&#34;color:#ffa500&#34;&gt;@JsonProperty&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;joke&amp;#34;&lt;/span&gt;)
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; String joke;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6869610311020900353/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day33.png&#34; alt=&#34;Day 33 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 32: Using Objects.equals() when values may be null</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day32/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day32/</id>
    <published>2021-11-17T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using Objects.equals() when one of the values may be null.</summary>
    <content type="html">&lt;p&gt;Using &lt;code&gt;Objects.equals()&lt;/code&gt; when one of the values may be &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Objects&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day32&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String file1Name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;data.zip&amp;#34;&lt;/span&gt;;
        String file2Name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;data.json&amp;#34;&lt;/span&gt;;

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Objects.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;, file2Name));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file2Name.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(file1Name));

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Changing file2Name to data.zip to get equality.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        file2Name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;data.zip&amp;#34;&lt;/span&gt;;
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Objects.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(file1Name, file2Name));

        file2Name = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(Objects.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(file1Name, file2Name));
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// This will give NullPointerException as null.equals() is not possible.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file2Name.&lt;span style=&#34;color:#bbb&#34;&gt;equals&lt;/span&gt;(file1Name));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6866753869075116032/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day32.png&#34; alt=&#34;Day 32 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 31: Compressing and decompressing text with Deflater and Inflater</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day31/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day31/</id>
    <published>2021-11-10T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Compressing and decompressing text with Deflater and Inflater.</summary>
    <content type="html">&lt;p&gt;Compressing and decompressing text with &lt;code&gt;Deflater&lt;/code&gt; and &lt;code&gt;Inflater&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post. The original graphic used a longer novel excerpt as sample text; this version keeps the same compression flow with a neutral sample paragraph.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.charset.StandardCharsets&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.zip.DataFormatException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.zip.Deflater&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.zip.Inflater&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day31&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String message = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;A sample paragraph that will be compressed and decompressed to show how Deflater and Inflater work in Java.&amp;#34;&lt;/span&gt;;

        CompressedData compressedData = compressString(message);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Original String length = &amp;#34;&lt;/span&gt; + message.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;());
        String compressedString = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(compressedData.&lt;span style=&#34;color:#bbb&#34;&gt;compressedData&lt;/span&gt;, StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Compressed string length = &amp;#34;&lt;/span&gt; + compressedString.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;());

        String deCompressedString = decompressString(compressedData);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Compressed String:\n&amp;#34;&lt;/span&gt; + compressedString);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Decompressed string:\n&amp;#34;&lt;/span&gt; + deCompressedString);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;CompressedData&lt;/span&gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] compressedData;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; compressedSize;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;CompressedData&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] compressedData, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; compressedSize) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;compressedData&lt;/span&gt; = compressedData;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;compressedSize&lt;/span&gt; = compressedSize;
        }
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; CompressedData &lt;span style=&#34;color:#447fcf&#34;&gt;compressString&lt;/span&gt;(String contentPath) {
        Deflater deflater = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Deflater();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] content = contentPath.&lt;span style=&#34;color:#bbb&#34;&gt;getBytes&lt;/span&gt;(StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);
        deflater.&lt;span style=&#34;color:#bbb&#34;&gt;setInput&lt;/span&gt;(content);
        deflater.&lt;span style=&#34;color:#bbb&#34;&gt;finish&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] compressed = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[content.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; compressedSize = deflater.&lt;span style=&#34;color:#bbb&#34;&gt;deflate&lt;/span&gt;(compressed, 0, contentPath.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;(), Deflater.&lt;span style=&#34;color:#bbb&#34;&gt;NO_FLUSH&lt;/span&gt;);
        deflater.&lt;span style=&#34;color:#bbb&#34;&gt;end&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; CompressedData(compressed, compressedSize);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;decompressString&lt;/span&gt;(CompressedData compressedString) {
        Inflater inflater = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Inflater();
        inflater.&lt;span style=&#34;color:#bbb&#34;&gt;setInput&lt;/span&gt;(compressedString.&lt;span style=&#34;color:#bbb&#34;&gt;compressedData&lt;/span&gt;, 0, compressedString.&lt;span style=&#34;color:#bbb&#34;&gt;compressedSize&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[] original = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;byte&lt;/span&gt;[compressedString.&lt;span style=&#34;color:#bbb&#34;&gt;compressedData&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;length&lt;/span&gt;];
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; originalLength = 0;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            originalLength = inflater.&lt;span style=&#34;color:#bbb&#34;&gt;inflate&lt;/span&gt;(original);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (DataFormatException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
        inflater.&lt;span style=&#34;color:#bbb&#34;&gt;end&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(original, 0, originalLength, StandardCharsets.&lt;span style=&#34;color:#bbb&#34;&gt;UTF_8&lt;/span&gt;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6864167276724256768/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day31.png&#34; alt=&#34;Day 31 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 30: Exploring a generator-style approach in Java with Supplier and IntStream</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day30/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day30/</id>
    <published>2021-11-04T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Exploring a generator-style approach in Java with Supplier and IntStream.generate().</summary>
    <content type="html">&lt;p&gt;Exploring a generator-style approach in Java with &lt;code&gt;Supplier&lt;/code&gt; and &lt;code&gt;IntStream.generate()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.IntSupplier&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.IntStream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day30&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Function&amp;lt;Integer, Integer&amp;gt; squareFunction = integer -&amp;gt; integer * integer;

        SupplierProvider squareSupplier = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; SupplierProvider(squareFunction);

        IntStream myStream = IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;generate&lt;/span&gt;(squareSupplier);
        myStream.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;(10).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;---------------- INTERVAL ----------------&amp;#34;&lt;/span&gt;);
        IntStream stream = IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;generate&lt;/span&gt;(squareSupplier);
        stream.&lt;span style=&#34;color:#bbb&#34;&gt;limit&lt;/span&gt;(5).&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;SupplierProvider&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; IntSupplier {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0;
        Function&amp;lt;Integer, Integer&amp;gt; function;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;SupplierProvider&lt;/span&gt;(Function&amp;lt;Integer, Integer&amp;gt; function) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;function&lt;/span&gt; = function;
        }

        &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getAsInt&lt;/span&gt;() {
            i++;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; function.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(i);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6862015600714235905/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day30.png&#34; alt=&#34;Day 30 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 29: ParameterizedTest and MethodSource for repeated test inputs</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day29/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day29/</id>
    <published>2021-10-28T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using ParameterizedTest and MethodSource to run the same file-presence test with different inputs.</summary>
    <content type="html">&lt;p&gt;Using &lt;code&gt;ParameterizedTest&lt;/code&gt; and &lt;code&gt;MethodSource&lt;/code&gt; to run the same file-presence test with different inputs.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import static&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.api.Assertions.assertEquals&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Files&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Path&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Paths&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.params.ParameterizedTest&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.params.provider.Arguments&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.junit.jupiter.params.provider.MethodSource&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day29&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String PATH = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;;

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;isFileAvailable&lt;/span&gt;(String relativeFilePath) {
        List&amp;lt;String&amp;gt; fileNames = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; paths = Files.&lt;span style=&#34;color:#bbb&#34;&gt;walk&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(PATH))) {
            fileNames = paths
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(Files::isRegularFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(Path::toAbsolutePath)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(Path::toString)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileNames.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(relativeFilePath);
    }

    &lt;span style=&#34;color:#ffa500&#34;&gt;@ParameterizedTest&lt;/span&gt;(name = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;{index} - Test with fileName : {0}&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#ffa500&#34;&gt;@MethodSource&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;fileNameProvider&amp;#34;&lt;/span&gt;)
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;testFilePresentOrNot&lt;/span&gt;(String fileName, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;boolean&lt;/span&gt; expectedResult) {
        assertEquals(expectedResult, isFileAvailable(fileName));
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Stream&amp;lt;Arguments&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;fileNameProvider&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Stream.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
            Arguments.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(PATH + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/data.json&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;true&lt;/span&gt;),
            Arguments.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(PATH + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/404.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;false&lt;/span&gt;)
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6859503859304407040/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day29.png&#34; alt=&#34;Day 29 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 28: Arrays.asList() and new ArrayList&lt;&gt;() are not the same</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day28/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day28/</id>
    <published>2021-10-22T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Arrays.asList() and new ArrayList&amp;lt;&amp;gt;() both return lists, but they do not behave the same way.</summary>
    <content type="html">&lt;p&gt;&lt;code&gt;Arrays.asList()&lt;/code&gt; and &lt;code&gt;new ArrayList&amp;lt;&amp;gt;()&lt;/code&gt; both return lists, but they do not behave the same way.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Arrays&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day28&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        List&amp;lt;String&amp;gt; filePathsFromList = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        filePathsFromList.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;);
        filePathsFromList.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Pictures&amp;#34;&lt;/span&gt;);

        String[] paths = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String[]{
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Pictures&amp;#34;&lt;/span&gt;
        };
        List&amp;lt;String&amp;gt; filePathsFormArray = Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(paths);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Calling add on a list created from Arrays.asList()
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// will throw UnsupportedOperationException.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        filePathsFormArray.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Applications&amp;#34;&lt;/span&gt;);

        filePathsFromList.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Applications&amp;#34;&lt;/span&gt;);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Arrays.asList() returns ArrayList? &amp;#34;&lt;/span&gt;
            + (filePathsFormArray &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; ArrayList));
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;new ArrayList&amp;lt;&amp;gt;() returns ArrayList? &amp;#34;&lt;/span&gt;
            + (filePathsFromList &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; ArrayList));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6857290678196686848/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day28.png&#34; alt=&#34;Day 28 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 27: Implementing a Unix pipe-like class in Java with Function composition</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day27/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day27/</id>
    <published>2021-10-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Implementing a Unix pipe-like class in Java with Function composition.</summary>
    <content type="html">&lt;p&gt;Implementing a Unix pipe-like class in Java with &lt;code&gt;Function&lt;/code&gt; composition.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.LocalDateTime&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.format.DateTimeFormatter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Matcher&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.Pattern&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day27&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Function&amp;lt;String, String&amp;gt; awk1 = commandLine -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; String regex = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})&amp;#34;&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Pattern pattern = Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;compile&lt;/span&gt;(regex, Pattern.&lt;span style=&#34;color:#bbb&#34;&gt;MULTILINE&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Matcher matcher = pattern.&lt;span style=&#34;color:#bbb&#34;&gt;matcher&lt;/span&gt;(commandLine);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (matcher.&lt;span style=&#34;color:#bbb&#34;&gt;find&lt;/span&gt;()) {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; matcher.&lt;span style=&#34;color:#bbb&#34;&gt;group&lt;/span&gt;(0);
            }
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
        };

        Function&amp;lt;List&amp;lt;String&amp;gt;, String&amp;gt; grepFirstOccurrence = history -&amp;gt; history.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(str -&amp;gt; str.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;))
            .&lt;span style=&#34;color:#bbb&#34;&gt;findFirst&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElse&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;);

        Function&amp;lt;String, LocalDateTime&amp;gt; dateTimeToLocalDateTime = dateTimeText -&amp;gt; {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.&lt;span style=&#34;color:#bbb&#34;&gt;ofPattern&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; LocalDateTime.&lt;span style=&#34;color:#bbb&#34;&gt;parse&lt;/span&gt;(dateTimeText, dateTimeFormatter);
        };

        List&amp;lt;String&amp;gt; history = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        history.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;876 2021-10-12 15:59:47 docker ps&amp;#34;&lt;/span&gt;);
        history.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;877 2021-10-12 13:33:18 docker volume ls&amp;#34;&lt;/span&gt;);

        LocalDateTime filteredResult = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Pipeline&amp;lt;&amp;gt;(grepFirstOccurrence)
            .&lt;span style=&#34;color:#bbb&#34;&gt;pipeableCommand&lt;/span&gt;(awk1)
            .&lt;span style=&#34;color:#bbb&#34;&gt;pipeableCommand&lt;/span&gt;(dateTimeToLocalDateTime)
            .&lt;span style=&#34;color:#bbb&#34;&gt;execute&lt;/span&gt;(history);

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(filteredResult);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Pipeline&lt;/span&gt;&amp;lt;input, output&amp;gt; {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Function&amp;lt;input, output&amp;gt; function;

        Pipeline(Function&amp;lt;input, output&amp;gt; function) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;function&lt;/span&gt; = function;
        }

        &amp;lt;intermediate&amp;gt; Pipeline&amp;lt;input, intermediate&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;pipeableCommand&lt;/span&gt;(Function&amp;lt;output, intermediate&amp;gt; anotherFunction) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Pipeline&amp;lt;&amp;gt;(input -&amp;gt; anotherFunction.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(function.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(input)));
        }

        output &lt;span style=&#34;color:#447fcf&#34;&gt;execute&lt;/span&gt;(input input) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; function.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(input);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6854420697683492864/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day27.png&#34; alt=&#34;Day 27 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 26: Writing a method to retry another method execution</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day26/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day26/</id>
    <published>2021-09-30T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Writing a method to retry another method execution, using TimerTask&amp;rsquo;s schedule() and scheduleAtFixedRate to check availability</summary>
    <content type="html">&lt;p&gt;Writing a method which can take another method and run that and if needed
retry that execution given number of times. Using Runnable and scheduleAtFixedRate()
from timer class.&lt;/p&gt;
&lt;p&gt;TimerTask along with Timer class can schedule tasks using background thread. Timer has two type of scheduling option
* schedule (Fixed delayed execution)
* scheduleAtFixedRate (Fixed rate execution)&lt;/p&gt;
&lt;h4 id=&#34;fixed-delay-execution&#34;&gt;Fixed Delay Execution:&lt;/h4&gt;
&lt;p&gt;Execution after the first execution does not depend on the start time of the execution rather than the completion of the first execution then it starts the second execution&lt;/p&gt;
&lt;h4 id=&#34;fixed-rate-execution&#34;&gt;Fixed Rate Execution:&lt;/h4&gt;
&lt;p&gt;Execution after the first execution does depend on the start time of the execution. Second and execution afterwards&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;	&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day26&lt;/span&gt; {
    
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
            retryMethod(() -&amp;gt; uptimeCheck(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://twitter.com&amp;#34;&lt;/span&gt;), 3, 5000L);                           
        }
    
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;retryMethod&lt;/span&gt;(Runnable function, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; retryCount, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; retryInterval) {
            Timer timer = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Timer();
            timer.&lt;span style=&#34;color:#bbb&#34;&gt;scheduleAtFixedRate&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; TimerTask() {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; count = 0;
    
                &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;run&lt;/span&gt;() {
                    count++;
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (count == retryCount) {
                        timer.&lt;span style=&#34;color:#bbb&#34;&gt;cancel&lt;/span&gt;();
                    }
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                        function.&lt;span style=&#34;color:#bbb&#34;&gt;run&lt;/span&gt;();
                    } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (Exception e) {
                        e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
                    }
                }
            }, 0, retryInterval);
        }
    
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;checkAvailability&lt;/span&gt;(String url) {
            HttpClient httpClient = HttpClient.&lt;span style=&#34;color:#bbb&#34;&gt;newHttpClient&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; statusCode = 0;
            HttpRequest httpRequest = HttpRequest
                    .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
                    .&lt;span style=&#34;color:#bbb&#34;&gt;uri&lt;/span&gt;(URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(url))
                    .&lt;span style=&#34;color:#bbb&#34;&gt;GET&lt;/span&gt;()
                    .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
                statusCode = httpClient.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(httpRequest, 		HttpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;BodyHandlers&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ofString&lt;/span&gt;()).&lt;span style=&#34;color:#bbb&#34;&gt;statusCode&lt;/span&gt;();
            } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException | InterruptedException e) {
                e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
            }
    
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (statusCode == 200)
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(url + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; is up and status: &amp;#34;&lt;/span&gt; + statusCode);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt;
                System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(url + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34; is down and status: &amp;#34;&lt;/span&gt; + statusCode);
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here &lt;strong&gt;retryMethod&lt;/strong&gt; is a method that takes a &lt;strong&gt;runnable&lt;/strong&gt; and interval time and retry count to run the runnable using &lt;strong&gt;TimerTask&lt;/strong&gt; and &lt;strong&gt;Timer&amp;rsquo;s&lt;/strong&gt; &lt;strong&gt;scheduleAtFixedRate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Furthermore here &lt;strong&gt;checkAvailability&lt;/strong&gt; method takes an url and check if the url returns 200 thus getting a partial knowledge about if the site is up or down.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 25: Using a implementation of supplier creating and caching a large file (any Class in this case that will initialize a very large object) lazily and thread-safe.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day25/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day25/</id>
    <published>2021-09-21T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using a implementation of supplier creating and caching a large file (any Class in this case that will initialize a very large object) lazily and thread-safe.</summary>
    <content type="html">&lt;p&gt;Using a implementation of supplier creating and caching a large file (any Class in this case that will initialize a very large object) lazily and thread-safe.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;46
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileNotFoundException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Optional&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Supplier&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day25&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        FileLoader largeFileLoader = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileLoader();
        File largeFile = largeFileLoader
            .&lt;span style=&#34;color:#bbb&#34;&gt;getLargeFile&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElseThrow&lt;/span&gt;(FileNotFoundException::&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(largeFile.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;());
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FileLoader&lt;/span&gt; {

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; Supplier&amp;lt;Optional&amp;lt;File&amp;gt;&amp;gt; largeFile =
            () -&amp;gt; createAndCacheFile(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads/data.json&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;FileLoader&lt;/span&gt;() {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;File Loader created&amp;#34;&lt;/span&gt;);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Optional&amp;lt;File&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getLargeFile&lt;/span&gt;() {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; largeFile.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;synchronized&lt;/span&gt; Optional&amp;lt;File&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;createAndCacheFile&lt;/span&gt;(String path) {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;LargeFileFactory&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; Supplier&amp;lt;Optional&amp;lt;File&amp;gt;&amp;gt; {
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; File largeFileInstance = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; File(path);

                &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
                &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; Optional&amp;lt;File&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;get&lt;/span&gt;() {
                    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; largeFileInstance.&lt;span style=&#34;color:#bbb&#34;&gt;exists&lt;/span&gt;()
                        ? Optional.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(largeFileInstance) : Optional.&lt;span style=&#34;color:#bbb&#34;&gt;empty&lt;/span&gt;();
                }
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (!(largeFile &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;instanceof&lt;/span&gt; LargeFileFactory)) {
                largeFile = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; LargeFileFactory();
            }

            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; largeFile.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6846070390435921922/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day25.png&#34; alt=&#34;Day 25 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 24: Removing nulls from list using Collections.singleton and Objects.isNull</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day24/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day24/</id>
    <published>2021-09-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Removing nulls from list using Collections.singleton and Objects.isNull</summary>
    <content type="html">&lt;p&gt;Removing nulls from list using Collections.singleton and Objects.isNull&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Arrays&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Collections&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Objects&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day24&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String[] filesFromDirUsr = {&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;A.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;C.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;G.txt&amp;#34;&lt;/span&gt;};
        List&amp;lt;String&amp;gt; usrFiles = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;(Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(filesFromDirUsr));

        String[] fileFromDirDownloads = {&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;X.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;J.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;N.txt&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;};
        List&amp;lt;String&amp;gt; downloadedFiles = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;(Arrays.&lt;span style=&#34;color:#bbb&#34;&gt;asList&lt;/span&gt;(fileFromDirDownloads));

        usrFiles.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
        downloadedFiles.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);

        usrFiles.&lt;span style=&#34;color:#bbb&#34;&gt;removeAll&lt;/span&gt;(Collections.&lt;span style=&#34;color:#bbb&#34;&gt;singleton&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;));
        downloadedFiles.&lt;span style=&#34;color:#bbb&#34;&gt;removeIf&lt;/span&gt;(Objects::isNull);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;();

        usrFiles.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
        downloadedFiles.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6843564935948173312/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day24.png&#34; alt=&#34;Day 24 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 23: TemporalAdjuster ofDateAdjuster implementation and DayOfWeek calculating the next working day with Bangla name.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day23/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day23/</id>
    <published>2021-09-08T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">TemporalAdjuster ofDateAdjuster implementation and DayOfWeek calculating the next working day with Bangla name.</summary>
    <content type="html">&lt;p&gt;TemporalAdjuster ofDateAdjuster implementation and DayOfWeek calculating the next working day with Bangla name.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.DayOfWeek&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.LocalDate&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.format.TextStyle&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.temporal.TemporalAdjuster&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.temporal.TemporalAdjusters&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Locale&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day23&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        LocalDate today = LocalDate.&lt;span style=&#34;color:#bbb&#34;&gt;now&lt;/span&gt;();
        LocalDate nextWorkingDay = today.&lt;span style=&#34;color:#bbb&#34;&gt;with&lt;/span&gt;(Day23.&lt;span style=&#34;color:#bbb&#34;&gt;nextWorkingDay&lt;/span&gt;);
        DayOfWeek namedDate = nextWorkingDay.&lt;span style=&#34;color:#bbb&#34;&gt;getDayOfWeek&lt;/span&gt;();

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(namedDate.&lt;span style=&#34;color:#bbb&#34;&gt;getDisplayName&lt;/span&gt;(TextStyle.&lt;span style=&#34;color:#bbb&#34;&gt;FULL&lt;/span&gt;, Locale.&lt;span style=&#34;color:#bbb&#34;&gt;forLanguageTag&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;bn-BD&amp;#34;&lt;/span&gt;)));
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; TemporalAdjuster nextWorkingDay = TemporalAdjusters.&lt;span style=&#34;color:#bbb&#34;&gt;ofDateAdjuster&lt;/span&gt;(localDate -&amp;gt; {
        DayOfWeek dayOfWeek = localDate.&lt;span style=&#34;color:#bbb&#34;&gt;getDayOfWeek&lt;/span&gt;();

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; daysToAddToGetWorkingDay;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; daysToOffsetForFriday = 2;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; daysToOffsetForSaturday = 1;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; daysToOffsetOtherDay = 1;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (dayOfWeek == DayOfWeek.&lt;span style=&#34;color:#bbb&#34;&gt;FRIDAY&lt;/span&gt;)
            daysToAddToGetWorkingDay = daysToOffsetForFriday;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (dayOfWeek == DayOfWeek.&lt;span style=&#34;color:#bbb&#34;&gt;SATURDAY&lt;/span&gt;)
            daysToAddToGetWorkingDay = daysToOffsetForSaturday;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;else&lt;/span&gt;
            daysToAddToGetWorkingDay = daysToOffsetOtherDay;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; localDate.&lt;span style=&#34;color:#bbb&#34;&gt;plusDays&lt;/span&gt;(daysToAddToGetWorkingDay);
    });
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6841354321813221376/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day23.png&#34; alt=&#34;Day 23 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 22: Using stream of streams and flatmapping it to concat multiple streams</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day22/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day22/</id>
    <published>2021-09-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using stream of streams and flatmapping it to concat multiple streams</summary>
    <content type="html">&lt;p&gt;Using stream of streams and flatmapping it to concat multiple streams&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.LocalDate&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.format.DateTimeFormatter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day22&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.&lt;span style=&#34;color:#bbb&#34;&gt;ofPattern&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;dd/MM/yyyy&amp;#34;&lt;/span&gt;);
        List&amp;lt;String&amp;gt; publicHolidaysOfBD = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;16/02/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;21/02/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;14/04/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;17/03/2021&amp;#34;&lt;/span&gt;);
        List&amp;lt;String&amp;gt; publicHolidaysOfUS = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;01/01/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;17/03/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;04/07/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;14/02/2021&amp;#34;&lt;/span&gt;);
        List&amp;lt;String&amp;gt; publicHolidaysOfCA = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;01/01/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;20/04/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;01/07/2021&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;17/03/2021&amp;#34;&lt;/span&gt;);

        Stream&amp;lt;Stream&amp;lt;String&amp;gt;&amp;gt; streamConcat = Stream.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(
            publicHolidaysOfCA.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(),
            publicHolidaysOfBD.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;(),
            publicHolidaysOfUS.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
        );

        streamConcat
            .&lt;span style=&#34;color:#bbb&#34;&gt;flatMap&lt;/span&gt;(Function.&lt;span style=&#34;color:#bbb&#34;&gt;identity&lt;/span&gt;())
            .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(convertToLocalDate(dateTimeFormatter))
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Function&amp;lt;String, LocalDate&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;convertToLocalDate&lt;/span&gt;(DateTimeFormatter dateTimeFormatter) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; (date -&amp;gt; LocalDate.&lt;span style=&#34;color:#bbb&#34;&gt;parse&lt;/span&gt;(date, dateTimeFormatter));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6840665221946843136/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day22.png&#34; alt=&#34;Day 22 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 21: Optional.ifPresent and Optional.filter to log and filter the Scheduled Day according to holiday</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day21/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day21/</id>
    <published>2021-08-31T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Optional.ifPresent and Optional.filter to log and filter the Scheduled Day according to holiday</summary>
    <content type="html">&lt;p&gt;Optional.ifPresent and Optional.filter to log and filter the Scheduled Day according to holiday&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.time.LocalDate&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Optional&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.Logger&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.LoggerFactory&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day21&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(Day21.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        Optional&amp;lt;LocalDate&amp;gt; scheduleDay = ScheduleService.&lt;span style=&#34;color:#bbb&#34;&gt;getAvailableScheduleDay&lt;/span&gt;();
        scheduleDay.&lt;span style=&#34;color:#bbb&#34;&gt;ifPresent&lt;/span&gt;(localDate -&amp;gt; logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Available Schedule day is {}&amp;#34;&lt;/span&gt;, localDate));

        LocalDate scheduleDateToString = scheduleDay
            .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(HolidayDateService::checkHoliday)
            .&lt;span style=&#34;color:#bbb&#34;&gt;orElseThrow&lt;/span&gt;(() -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; NoHolidayException(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;No available Sync Time. Reschedule&amp;#34;&lt;/span&gt;));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6838479434283147264/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day21.png&#34; alt=&#34;Day 21 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 20: Some previous post had optional.get() in them which is not a best practice if its not with Optional.isPresent(). better than isPresent is to use orElse(), orElseGet(), orElseThrow()</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day20/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day20/</id>
    <published>2021-08-20T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Some previous post had optional.get() in them which is not a best practice if its not with Optional.isPresent(). better than isPresent is to use orElse(), orElseGet(), orElseThrow()</summary>
    <content type="html">&lt;p&gt;Some previous post had optional.get() in them which is not a best practice if its not with Optional.isPresent(). better than isPresent is to use orElse(), orElseGet(), orElseThrow()&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.OptionalInt&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.IntSupplier&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.IntStream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day20&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; Exception {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; defaultNumber = Integer.&lt;span style=&#34;color:#bbb&#34;&gt;MAX_VALUE&lt;/span&gt;;
        IntSupplier intSupplier = () -&amp;gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt;) (Math.&lt;span style=&#34;color:#bbb&#34;&gt;random&lt;/span&gt;() * 100);

        IntStream intStream = IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0, 10);
        OptionalInt maxValue = intStream
            .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(i -&amp;gt; i &amp;gt; 3)
            .&lt;span style=&#34;color:#bbb&#34;&gt;findAny&lt;/span&gt;();

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get value. if not present then get the default number
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxValueOrElse = maxValue.&lt;span style=&#34;color:#bbb&#34;&gt;orElse&lt;/span&gt;(defaultNumber);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get value. if not present get free provided supplier
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxValueOrElseGet = maxValue.&lt;span style=&#34;color:#bbb&#34;&gt;orElseGet&lt;/span&gt;(intSupplier);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// get value. if not present throws an exception
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; maxValueOrElseThrow = maxValue.&lt;span style=&#34;color:#bbb&#34;&gt;orElseThrow&lt;/span&gt;(() -&amp;gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Exception(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;No value present&amp;#34;&lt;/span&gt;));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6834503322163122176/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day20.png&#34; alt=&#34;Day 20 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 19: Stream.peek to get debug information and log it.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day19/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day19/</id>
    <published>2021-08-17T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Stream.peek to get debug information and log it.</summary>
    <content type="html">&lt;p&gt;Stream.peek to get debug information and log it.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Files&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Path&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.attribute.BasicFileAttributes&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Date&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.Logger&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;org.slf4j.LoggerFactory&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day19&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Logger logger = LoggerFactory.&lt;span style=&#34;color:#bbb&#34;&gt;getLogger&lt;/span&gt;(Day19.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;logFileMetadata&lt;/span&gt;(File file) {
        Path path = Path.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;getAbsolutePath&lt;/span&gt;());
        BasicFileAttributes basicFileAttributes = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            basicFileAttributes = Files.&lt;span style=&#34;color:#bbb&#34;&gt;readAttributes&lt;/span&gt;(path, BasicFileAttributes.&lt;span style=&#34;color:#bbb&#34;&gt;class&lt;/span&gt;);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }

        logger.&lt;span style=&#34;color:#bbb&#34;&gt;info&lt;/span&gt;(
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;File Name is {}\n Creation Time {}\n Size {}\n Last modified {}&amp;#34;&lt;/span&gt;,
            file.&lt;span style=&#34;color:#bbb&#34;&gt;getName&lt;/span&gt;(),
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Date(basicFileAttributes.&lt;span style=&#34;color:#bbb&#34;&gt;creationTime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;()),
            basicFileAttributes.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() / 1024,
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Date(basicFileAttributes.&lt;span style=&#34;color:#bbb&#34;&gt;lastModifiedTime&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toMillis&lt;/span&gt;())
        );
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        List&amp;lt;File&amp;gt; selectedFilesForUpload = getFileList(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;);
        selectedFilesForUpload.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(File::exists)
            .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(File::getAbsoluteFile)
            .&lt;span style=&#34;color:#bbb&#34;&gt;peek&lt;/span&gt;(Day19::logFileMetadata)
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(file -&amp;gt; FileUploadService.&lt;span style=&#34;color:#bbb&#34;&gt;upload&lt;/span&gt;(file));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6833411009718435840/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day19.png&#34; alt=&#34;Day 19 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 18: using Scanner.findAll to get all the download links from a json file.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day18/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day18/</id>
    <published>2021-08-13T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">using Scanner.findAll to get all the download links from a json file.</summary>
    <content type="html">&lt;p&gt;using Scanner.findAll to get all the download links from a json file.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileNotFoundException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Scanner&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.regex.MatchResult&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day18&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        File file = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; File(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads/data.json&amp;#34;&lt;/span&gt;);

        String urlRegex = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\&amp;#34;(https?|ftp|file)://[-a-zA-Z0-9+&amp;amp;@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;amp;@#/%=~_|]\&amp;#34;&amp;#34;&lt;/span&gt;;
        String propertyName = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;\&amp;#34;downloadLink\&amp;#34;:\&amp;#34;&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Scanner scanner = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; Scanner(file)) {
            scanner.&lt;span style=&#34;color:#bbb&#34;&gt;findAll&lt;/span&gt;(propertyName + urlRegex)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(MatchResult::group)
                .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (FileNotFoundException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6831959356175716352/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day18.png&#34; alt=&#34;Day 18 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 17: Unicode decoding side effect. Application throws exception when a comment is removed.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day17/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day17/</id>
    <published>2021-08-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Unicode decoding side effect. Application throws exception when a comment is removed.</summary>
    <content type="html">&lt;p&gt;Unicode decoding side effect. Application throws exception when a comment is removed.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/u000d in unicode is new line so when unicode decoding happens
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;the code is in new line and becomes valid java code.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;Unicode decoding is a process for decoding unicode characters
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;then converting it to ASCII
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;while java code compiles it, first unicode decoding happens then
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;lexical translation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;*/&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day17&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; number = 0;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Please don&amp;#39;t remove below comment. Program will crash
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// \u000d number = 10;
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(10 / number);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6829403842657046528/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day17.png&#34; alt=&#34;Day 17 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 16: Two interface having same signature default method causing to override them.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day16/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day16/</id>
    <published>2021-08-03T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Two interface having same signature default method causing to override them.</summary>
    <content type="html">&lt;p&gt;Two interface having same signature default method causing to override them.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Files&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.Paths&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FileUploadExternalDevice&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;upload&lt;/span&gt;(File file, String path) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        Files.&lt;span style=&#34;color:#bbb&#34;&gt;move&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;toPath&lt;/span&gt;(), Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(path));
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;FileUploadAPIEndpoint&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;upload&lt;/span&gt;(File file, String path) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        MultipartFile multiPartFile = multiPart(file);
        fileUploadService.&lt;span style=&#34;color:#bbb&#34;&gt;storeFile&lt;/span&gt;(multiPartFile);
    }
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day015&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;implements&lt;/span&gt; FileUploadExternalDevice, FileUploadAPIEndpoint {

    &lt;span style=&#34;color:#ffa500&#34;&gt;@Override&lt;/span&gt;
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;upload&lt;/span&gt;(File file, String path) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        implementation
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        or
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        FileUploadExternalDevice.super.upload(file, path);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        or
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        FileUploadAPIEndpoint.super.upload(file, path);
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;        */&lt;/span&gt;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6828326505286893568/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day16.png&#34; alt=&#34;Day 16 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 15: Batching files and moving them using intStream</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day15/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day15/</id>
    <published>2021-07-27T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Batching files and moving them using intStream</summary>
    <content type="html">&lt;p&gt;Batching files and moving them using intStream&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.IntStream&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day015&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchSize = 100;
        Path dirPath = getDirPath();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; List&amp;lt;File&amp;gt; files = getFileList(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;);
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; batchRange = (files.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() + batchSize - 1) / batchSize;

        IntStream.&lt;span style=&#34;color:#bbb&#34;&gt;range&lt;/span&gt;(0, batchRange)
            .&lt;span style=&#34;color:#bbb&#34;&gt;mapToObj&lt;/span&gt;(i -&amp;gt; files.&lt;span style=&#34;color:#bbb&#34;&gt;subList&lt;/span&gt;(i * batchSize, Math.&lt;span style=&#34;color:#bbb&#34;&gt;min&lt;/span&gt;(files.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;(), (i + 1) * batchSize)))
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(filesInBatch -&amp;gt; moveToDir(filesInBatch, dirPath));
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;File&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getFileList&lt;/span&gt;(String path) {
        List&amp;lt;File&amp;gt; files = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; pathStream = Files.&lt;span style=&#34;color:#bbb&#34;&gt;walk&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(path))) {
            files = pathStream
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(Files::isRegularFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(Path::toFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; files;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6825808817792675840/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day15.png&#34; alt=&#34;Day 15 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 14: Using stream parallel to add id to file names.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day14/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day14/</id>
    <published>2021-07-23T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using stream parallel to add id to file names.</summary>
    <content type="html">&lt;p&gt;Using stream parallel to add id to file names.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day014&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        Function&amp;lt;String, String&amp;gt; addIdToFile = (file) -&amp;gt; {
            String hashCode = Integer.&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;(file.&lt;span style=&#34;color:#bbb&#34;&gt;hashCode&lt;/span&gt;());
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; file + &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + hashCode;
        };

        List&amp;lt;String&amp;gt; fileNames = getFileNameList(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;);

        fileNames.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;parallel&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(addIdToFile)
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; List&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getFileNameList&lt;/span&gt;(String path) {
        Function&amp;lt;String, String&amp;gt; getFileName = (file) -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; index = file.&lt;span style=&#34;color:#bbb&#34;&gt;lastIndexOf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (index == -1) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; file.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(0, index);
        };

        List&amp;lt;String&amp;gt; fileNameList = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; paths = Files.&lt;span style=&#34;color:#bbb&#34;&gt;walk&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(path))) {
            fileNameList = paths
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(Files::isRegularFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(path1 -&amp;gt; path1.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(fileName -&amp;gt; !fileName.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(getFileName)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Exception Occured &amp;#34;&lt;/span&gt; + e.&lt;span style=&#34;color:#bbb&#34;&gt;getMessage&lt;/span&gt;());
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileNameList;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6824359230003400705/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day14.png&#34; alt=&#34;Day 14 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 13: Using Collectors.groupingBy and Collectors.counting to get numbers of file present of a particular type</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day13/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day13/</id>
    <published>2021-07-19T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using Collectors.groupingBy and Collectors.counting to get numbers of file present of a particular type</summary>
    <content type="html">&lt;p&gt;Using Collectors.groupingBy and Collectors.counting to get numbers of file present of a particular type&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Map&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Scratch&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
        Function&amp;lt;String, String&amp;gt; fileNameRemove = (fileName) -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; index = fileName.&lt;span style=&#34;color:#bbb&#34;&gt;lastIndexOf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (index == -1) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileName.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(index);
        };

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; paths = Files.&lt;span style=&#34;color:#bbb&#34;&gt;walk&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;))) {
            Map&amp;lt;String, Long&amp;gt; fileCountByType = paths
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(path -&amp;gt; Files.&lt;span style=&#34;color:#bbb&#34;&gt;isRegularFile&lt;/span&gt;(path))
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(path -&amp;gt; path.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(fileName -&amp;gt; !fileName.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(fileNameRemove)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;groupingBy&lt;/span&gt;(
                    Function.&lt;span style=&#34;color:#bbb&#34;&gt;identity&lt;/span&gt;(), Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;counting&lt;/span&gt;()
                ));
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(fileCountByType);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6822890146359316480/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day13.png&#34; alt=&#34;Day 13 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 12: Files.walk() and functional interface to remove file extension from fileNames</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day12/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day12/</id>
    <published>2021-07-14T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Files.walk() and functional interface to remove file extension from fileNames</summary>
    <content type="html">&lt;p&gt;Files.walk() and functional interface to remove file extension from fileNames&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.nio.file.*&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Collectors&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.Stream&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day12&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
        Function&amp;lt;String, String&amp;gt; extensionRemove = (fileName) -&amp;gt; {
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; index = fileName.&lt;span style=&#34;color:#bbb&#34;&gt;lastIndexOf&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;);
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (index == -1) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
            &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; fileName.&lt;span style=&#34;color:#bbb&#34;&gt;substring&lt;/span&gt;(0, index);
        };

        List&amp;lt;String&amp;gt; fileNameList;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (Stream&amp;lt;Path&amp;gt; paths = Files.&lt;span style=&#34;color:#bbb&#34;&gt;walk&lt;/span&gt;(Paths.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Downloads&amp;#34;&lt;/span&gt;))) {
            fileNameList = paths
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(Files::isRegularFile)
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(path -&amp;gt; path.&lt;span style=&#34;color:#bbb&#34;&gt;getFileName&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;filter&lt;/span&gt;(fileName -&amp;gt; !fileName.&lt;span style=&#34;color:#bbb&#34;&gt;isEmpty&lt;/span&gt;())
                .&lt;span style=&#34;color:#bbb&#34;&gt;map&lt;/span&gt;(extensionRemove)
                .&lt;span style=&#34;color:#bbb&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#bbb&#34;&gt;toList&lt;/span&gt;());
        }
        fileNameList.&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6821083331908771840/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day12.png&#34; alt=&#34;Day 12 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 11: Supplier, Consumer functional interface and httpclient to get and output Bitcoin info</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day11/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day11/</id>
    <published>2021-07-09T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Supplier, Consumer functional interface and httpclient to get and output Bitcoin info</summary>
    <content type="html">&lt;p&gt;Supplier, Consumer functional interface and httpclient to get and output Bitcoin info&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;37
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.URI&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpClient&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpRequest&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.net.http.HttpResponse&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Consumer&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Supplier&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day11&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
        Supplier&amp;lt;String&amp;gt; jsonStringSupplier = () -&amp;gt; getBitcoinInfoAsString();
        String str = jsonStringSupplier.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();

        Consumer&amp;lt;String&amp;gt; consumeString = s -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(s);
        consumeString.&lt;span style=&#34;color:#bbb&#34;&gt;accept&lt;/span&gt;(str);
    }

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getBitcoinInfoAsString&lt;/span&gt;() {
        HttpClient httpClient = HttpClient.&lt;span style=&#34;color:#bbb&#34;&gt;newHttpClient&lt;/span&gt;();

        HttpRequest httpRequest = HttpRequest
            .&lt;span style=&#34;color:#bbb&#34;&gt;newBuilder&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;uri&lt;/span&gt;(URI.&lt;span style=&#34;color:#bbb&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;https://api.coindesk.com/v1/bpi/currentprice.json&amp;#34;&lt;/span&gt;))
            .&lt;span style=&#34;color:#bbb&#34;&gt;header&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;)
            .&lt;span style=&#34;color:#bbb&#34;&gt;build&lt;/span&gt;();

        HttpResponse&amp;lt;String&amp;gt; httpResponse = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; {
            httpResponse = httpClient.&lt;span style=&#34;color:#bbb&#34;&gt;send&lt;/span&gt;(httpRequest, HttpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;BodyHandlers&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;ofString&lt;/span&gt;());
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (IOException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        } &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {
            e.&lt;span style=&#34;color:#bbb&#34;&gt;printStackTrace&lt;/span&gt;();
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; httpResponse.&lt;span style=&#34;color:#bbb&#34;&gt;body&lt;/span&gt;().&lt;span style=&#34;color:#bbb&#34;&gt;toString&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6819288877371662337/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day11.png&#34; alt=&#34;Day 11 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 10: Function is a functional interface that takes an input and gives an output. so functions can be chained.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day10/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day10/</id>
    <published>2021-07-06T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Function is a functional interface that takes an input and gives an output. so functions can be chained.</summary>
    <content type="html">&lt;p&gt;Function is a functional interface that takes an input and gives an output. so functions can be chained.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.function.Function&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day10&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
        Function&amp;lt;String, String&amp;gt; stringFunction = String::trim;
        Function&amp;lt;String, Boolean&amp;gt; stringFunctionChar = stringFunction
            .&lt;span style=&#34;color:#bbb&#34;&gt;andThen&lt;/span&gt;(String::toLowerCase)
            .&lt;span style=&#34;color:#bbb&#34;&gt;andThen&lt;/span&gt;(s -&amp;gt; s.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;function&amp;#34;&lt;/span&gt;));

        Boolean check = stringFunctionChar.&lt;span style=&#34;color:#bbb&#34;&gt;apply&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;A string to put in function&amp;#34;&lt;/span&gt;);
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(check.&lt;span style=&#34;color:#bbb&#34;&gt;booleanValue&lt;/span&gt;());
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6818201484791029760/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day10.png&#34; alt=&#34;Day 10 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 9: Functional interface</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day9/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day9/</id>
    <published>2021-07-05T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Functional interface</summary>
    <content type="html">&lt;p&gt;Functional interface&lt;/p&gt;
&lt;p&gt;A functional interface or single abstract method interface is a special type of interface. It can still declare default methods, and even &lt;code&gt;toString()&lt;/code&gt; without breaking the single-abstract-method constraint because the implementation can come from &lt;code&gt;Object&lt;/code&gt; at runtime.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#ffa500&#34;&gt;@FunctionalInterface&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;MyFunctionalInterface&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;init&lt;/span&gt;();

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;default&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;addString&lt;/span&gt;(String str) {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; str + str;
    }

    String &lt;span style=&#34;color:#447fcf&#34;&gt;toString&lt;/span&gt;();
}

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day09&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException, InterruptedException {
        MyFunctionalInterface myFunctionalInterface =
            () -&amp;gt; System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;My functional Interface&amp;#34;&lt;/span&gt;);
        myFunctionalInterface.&lt;span style=&#34;color:#bbb&#34;&gt;init&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6817832175115862016/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day09.png&#34; alt=&#34;Day 9 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 8: I always liked string interpolation in JS. Now i found out about Javas MessageFormat&#39;s format method which lets us in its way use string interpolation.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day8/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day8/</id>
    <published>2021-07-03T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">I always liked string interpolation in JS. Now i found out about Javas MessageFormat&amp;rsquo;s format method which lets us in its way use string interpolation.</summary>
    <content type="html">&lt;p&gt;I always liked string interpolation in JS. Now i found out about Javas MessageFormat&#39;&amp;rsquo;s format method which lets us in its way use string interpolation.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.text.MessageFormat&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day08&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String stringInterpolation = MessageFormat
            .&lt;span style=&#34;color:#bbb&#34;&gt;format&lt;/span&gt;(
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;MessageFormat.format makes {0} {1} happen&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;interpolation&amp;#34;&lt;/span&gt;
            );
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(stringInterpolation);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6817126165766111232/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day08.png&#34; alt=&#34;Day 8 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 7: Today i found out that string declared with &#34;&#34; are placed in string constant pool while with new keyword its in heap. String.intern() return string if defined in string pool otherwise creates the string and then returns it.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day7/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day7/</id>
    <published>2021-07-02T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Today i found out that string declared with &amp;quot;&amp;quot; are placed in string constant pool while with new keyword its in heap. String.intern() return string if defined in string pool otherwise creates the string and then returns it.</summary>
    <content type="html">&lt;p&gt;Today i found out that string declared with &amp;quot;&amp;quot; are placed in string constant pool while with new keyword its in heap. String.intern() return string if defined in string pool otherwise creates the string and then returns it.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day07&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String args[]) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// String is created in heap
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String file1 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;);
        String file2 = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; String(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// checking for memory location
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file1 == file2); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// false
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// String is created in String constant pool
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String file3 = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;rs&amp;#34;&lt;/span&gt;;
        String file4 = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;rs&amp;#34;&lt;/span&gt;;
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file3 == file4); &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// true
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// now using intern() getting a copy of docx in String pool
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String file5 = file2.&lt;span style=&#34;color:#bbb&#34;&gt;intern&lt;/span&gt;();
        String file6 = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// first check file2 and file5
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file2 == file5);
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// next check file5 and file6
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(file5 == file6);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6816780345023832064/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day07.png&#34; alt=&#34;Day 7 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 6: For Loop vs Foreach Loop Performance, and Why My First Benchmark Was Misleading</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day6/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day6/</id>
    <published>2021-07-01T00:00:00Z</published>
    <updated>2026-05-06T14:31:53&#43;06:00</updated>
    <summary type="html">The original quick timing test was a learning snapshot, not evidence that for loops are faster than foreach loops. This update explains the benchmark flaws and points to JMH.</summary>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Update, May 2026: the original benchmark below should not be treated as evidence that a classic &lt;code&gt;for&lt;/code&gt; loop is meaningfully faster than &lt;code&gt;foreach&lt;/code&gt;. It used &lt;code&gt;System.currentTimeMillis()&lt;/code&gt;, no warmup, no repeated forks, and loops whose work could be optimized away. A proper Java microbenchmark should use JMH and should consume real work so the JIT cannot remove the measurement target.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post is kept as a learning snapshot, but the conclusion has changed: prefer the loop that makes the code clearer unless a production measurement with representative data shows otherwise.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.ArrayList&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day06&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String args[]) {
        List&amp;lt;String&amp;gt; fileTypeList = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; ArrayList&amp;lt;&amp;gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 1000000; i++) {
            fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;fileType&amp;#34;&lt;/span&gt;);
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; beforeForLoop = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;(); i++) {
            fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;(i);
        }
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; afterForLoop = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Time took in millis for for &amp;#34;&lt;/span&gt; + (afterForLoop - beforeForLoop));

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; beforeForeachLoop = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;for&lt;/span&gt; (String s : fileTypeList) {
        }

        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;long&lt;/span&gt; afterForeachLoop = System.&lt;span style=&#34;color:#bbb&#34;&gt;currentTimeMillis&lt;/span&gt;();
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Time took in millis for foreach &amp;#34;&lt;/span&gt; + (afterForeachLoop - beforeForeachLoop));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;what-a-better-benchmark-needs&#34;&gt;What a better benchmark needs&lt;/h3&gt;
&lt;p&gt;A useful version of this test needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JMH warmup and measurement iterations.&lt;/li&gt;
&lt;li&gt;Several forks so one JVM run does not dominate the result.&lt;/li&gt;
&lt;li&gt;Real work inside each loop.&lt;/li&gt;
&lt;li&gt;A consumed result so the JIT cannot remove the loop.&lt;/li&gt;
&lt;li&gt;Representative data structures, because arrays, &lt;code&gt;ArrayList&lt;/code&gt;, &lt;code&gt;LinkedList&lt;/code&gt;, and custom collections do not behave the same way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For this series, Day 69 covers JMH in more detail: &lt;a href=&#34;/posts/java/100DaysOfJava/day69/&#34;&gt;Day 69 - Unlocking Java Performance Secrets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6816378176999186432/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day06.png&#34; alt=&#34;Day 6 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 5: Getting stream of char from string.chars()</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day5/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day5/</id>
    <published>2021-06-30T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Getting stream of char from string.chars()</summary>
    <content type="html">&lt;p&gt;Getting stream of char from string.chars()&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; * Getting a stream of characters from String.chars()
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day05&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String fileNameWithExtension = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;a-very-large-file-name.docx&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// this will give an IntStream where the int&amp;#39;s are character code
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// Getting characters by mapping to char
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        fileNameWithExtension.&lt;span style=&#34;color:#bbb&#34;&gt;chars&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;mapToObj&lt;/span&gt;(ch -&amp;gt; (&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;char&lt;/span&gt;) ch)
            .&lt;span style=&#34;color:#bbb&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;::println);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6816034222852190208/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day05.png&#34; alt=&#34;Day 5 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 4: try with resource helps to close open resources that uses .close() method to close.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day4/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day4/</id>
    <published>2021-06-29T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">try with resource helps to close open resources that uses .close() method to close.</summary>
    <content type="html">&lt;p&gt;try with resource helps to close open resources that uses .close() method to close.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;Try with resource is basically closing the resources where a programmer
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;would have to manually close FileWriter and BufferedWriter
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;*/&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.BufferedWriter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.File&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.FileWriter&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.io.IOException&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day04&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;throws&lt;/span&gt; IOException {
        File file = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; File(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;/home/mohibulhasan/Documents/example.txt&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// try with resource
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;try&lt;/span&gt; (
            FileWriter fileWriter = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; FileWriter(file);
            BufferedWriter bufferedWriter = &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;new&lt;/span&gt; BufferedWriter(fileWriter)
        ) {
            bufferedWriter.&lt;span style=&#34;color:#bbb&#34;&gt;write&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Found about try with resource.&amp;#34;&lt;/span&gt;);
            bufferedWriter.&lt;span style=&#34;color:#bbb&#34;&gt;newLine&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6815666266473418752/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day04.png&#34; alt=&#34;Day 4 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 3: Using Objects.requireNonNullElse() where Optional not being able to be used.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day3/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day3/</id>
    <published>2021-06-28T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Using Objects.requireNonNullElse() where Optional not being able to be used.</summary>
    <content type="html">&lt;p&gt;Using Objects.requireNonNullElse() where Optional not being able to be used.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;When returning a object that can have null value. wrapping it with an optional
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;can give you NullPointerException if object contains null.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;In this case using optional might create some issue.
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;*/&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day03&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// String fileExtension = getFileExtensionOpt().get();
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String fileExtension = Objects.&lt;span style=&#34;color:#bbb&#34;&gt;requireNonNullElse&lt;/span&gt;(
            getFileExtension(),
            &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;got null in getFileExtension()&amp;#34;&lt;/span&gt;
        );
        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(fileExtension);
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// will cause NullPointerException when get() is called on returned object
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; Optional&amp;lt;String&amp;gt; &lt;span style=&#34;color:#447fcf&#34;&gt;getFileExtensionOpt&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; Optional.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;);
    }

    &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// without optional
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#447fcf&#34;&gt;getFileExtension&lt;/span&gt;() {
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;null&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6815311983378870272/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day03.png&#34; alt=&#34;Day 3 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 2: Getting the last element of a Stream.</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day2/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day2/</id>
    <published>2021-06-27T00:00:00Z</published>
    <updated>2026-03-31T09:44:37&#43;06:00</updated>
    <summary type="html">Getting the last element of a Stream.</summary>
    <content type="html">&lt;p&gt;Getting the last element of a Stream.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;Getting the last element of a stream
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;*/&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day02&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        List&amp;lt;String&amp;gt; fileTypeList = List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jpg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;png&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;avi&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// using reduce
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String lastElement = fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;reduce&lt;/span&gt;((element1, element2) -&amp;gt; element2)
            .&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(lastElement);

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// using skip
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        String lastElement1 = fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;stream&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;skip&lt;/span&gt;(fileTypeList.&lt;span style=&#34;color:#bbb&#34;&gt;size&lt;/span&gt;() - 1)
            .&lt;span style=&#34;color:#bbb&#34;&gt;findFirst&lt;/span&gt;()
            .&lt;span style=&#34;color:#bbb&#34;&gt;get&lt;/span&gt;();

        System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(lastElement1);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6814832702764797952/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day02.png&#34; alt=&#34;Day 2 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Day 1: Checking Whether a String Matches One of Several Values</title>
    <link href="https://mohibulsblog.netlify.app/posts/java/100daysofjava/day1/" rel="alternate" type="text/html" />
    <id>https://mohibulsblog.netlify.app/posts/java/100daysofjava/day1/</id>
    <published>2021-06-26T00:00:00Z</published>
    <updated>2026-05-06T14:31:53&#43;06:00</updated>
    <summary type="html">A small Java example for checking whether a string matches one of several allowed values, with notes on List.of, Set.of, Apache Commons Lang, and streams.</summary>
    <content type="html">&lt;p&gt;This example checks whether one string is equal to any value from a fixed set of allowed strings.&lt;/p&gt;
&lt;p&gt;Transcribed from the original LinkedIn image post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;/*
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;Checking equality against multiple string
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;*/&lt;/span&gt;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.List&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.stream.*&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day01&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String fileType = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;;

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// have to assure that given fileType and comparing strings
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// are all in same case (case-sensitiveness)
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (List.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jpg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;png&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;avi&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(fileType)) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Founded file with type &amp;#34;&lt;/span&gt; + fileType);
        }

        &lt;span style=&#34;color:#999;font-style:italic&#34;&gt;// another way of doing it
&lt;/span&gt;&lt;span style=&#34;color:#999;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (Stream.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jpg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;png&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;avi&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#bbb&#34;&gt;anyMatch&lt;/span&gt;(fileType::equalsIgnoreCase)) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Founded file with type &amp;#34;&lt;/span&gt; + fileType);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;which-option-should-you-use&#34;&gt;Which option should you use?&lt;/h3&gt;
&lt;p&gt;For a small fixed list, &lt;code&gt;List.of(...).contains(value)&lt;/code&gt; is simple and readable.&lt;/p&gt;
&lt;p&gt;For repeated lookups or a larger set, keep the allowed values in a &lt;code&gt;Set&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#686868&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Locale&lt;/span&gt;;
&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;java.util.Set&lt;/span&gt;;

&lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#447fcf;text-decoration:underline&#34;&gt;Day01&lt;/span&gt; {
    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;final&lt;/span&gt; Set&amp;lt;String&amp;gt; ALLOWED_FILE_TYPES =
            Set.&lt;span style=&#34;color:#bbb&#34;&gt;of&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;jpg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;png&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;avi&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;docx&amp;#34;&lt;/span&gt;);

    &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#447fcf&#34;&gt;main&lt;/span&gt;(String[] args) {
        String fileType = &lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;mpeg&amp;#34;&lt;/span&gt;;
        &lt;span style=&#34;color:#6ab825;font-weight:bold&#34;&gt;if&lt;/span&gt; (ALLOWED_FILE_TYPES.&lt;span style=&#34;color:#bbb&#34;&gt;contains&lt;/span&gt;(fileType.&lt;span style=&#34;color:#bbb&#34;&gt;toLowerCase&lt;/span&gt;(Locale.&lt;span style=&#34;color:#bbb&#34;&gt;ROOT&lt;/span&gt;))) {
            System.&lt;span style=&#34;color:#bbb&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#bbb&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#ed9d13&#34;&gt;&amp;#34;Found file with type &amp;#34;&lt;/span&gt; + fileType);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If a project already uses Apache Commons Lang, &lt;code&gt;Strings.CS.equalsAny(...)&lt;/code&gt; or the relevant case-insensitive variant can express this directly without creating a collection at the call site. Streams are better when this check is part of a longer pipeline, not just for a standalone membership test.&lt;/p&gt;
&lt;p&gt;The original LinkedIn graphic is preserved below.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:share:6814533809460137984/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/images/100daysofjava/linkedin/day01.png&#34; alt=&#34;Day 1 LinkedIn post&#34;  /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
