<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Somenath Mukhopadhyay</title>
    <description>The latest articles on DEV Community by Somenath Mukhopadhyay (@sommukhopadhyay).</description>
    <link>https://dev.to/sommukhopadhyay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F81242%2F813bd4a4-5579-4538-b69f-2ea50d23c0fc.jpg</url>
      <title>DEV Community: Somenath Mukhopadhyay</title>
      <link>https://dev.to/sommukhopadhyay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sommukhopadhyay"/>
    <language>en</language>
    <item>
      <title>Class level locking in C++ - serializing multiple threads...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sat, 23 May 2026 08:53:59 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/class-level-locking-in-c-serializing-multiple-threads-45kk</link>
      <guid>https://dev.to/sommukhopadhyay/class-level-locking-in-c-serializing-multiple-threads-45kk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv4ho79clxsj65936yfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv4ho79clxsj65936yfs.png" alt="Serializing Threads" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I studied Android AsyncTask, especially when serialexecutor was the norm, I found how Google engineers have designed to serialize execution of multiple threads. My original code simulating similar effects using Java was done more than a decade ago. Here it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://som-itsolutions.blogspot.com/2026/05/class-level-locking-in-java-inspired-by.html" rel="noopener noreferrer"&gt;Read the full article on Som's Tech World&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today I did the same effect, but this time with modern C++.&lt;/p&gt;

&lt;p&gt;Here we go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//============================================================================&lt;/span&gt;
&lt;span class="c1"&gt;// Name        : ClassLevelLockingThreadSerialization.cpp&lt;/span&gt;
&lt;span class="c1"&gt;// Author      : Som&lt;/span&gt;
&lt;span class="c1"&gt;// Version     :&lt;/span&gt;
&lt;span class="c1"&gt;// Copyright   : som-itsolutions&lt;/span&gt;
&lt;span class="c1"&gt;// Description : Hello World in C++, Ansi-style&lt;/span&gt;
&lt;span class="c1"&gt;//============================================================================&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;future&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;chrono&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;mutex&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="n"&gt;classMutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nl"&gt;public:&lt;/span&gt;

    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;testMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;threadName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;lock_guard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The testMethod for "&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threadName&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="n"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;classMutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;testMethod&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Thread 1"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;f2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;testMethod&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Thread 2"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding the Synchronization&lt;br&gt;
The important part of the program is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;lock_guard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line acquires the mutex before entering the critical section. Since the mutex is declared as static, it is shared across all threads and all invocations of the method.&lt;/p&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;p&gt;only one thread can execute testMethod() at a time&lt;br&gt;
the second thread waits until the first thread releases the mutex&lt;br&gt;
thread execution becomes serialized&lt;br&gt;
This is conceptually similar to Java’s static synchronized methods.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Use std::lock_guard?
&lt;/h3&gt;

&lt;p&gt;Modern C++ prefers RAII-based locking instead of manually calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;std::lock_guard automatically releases the mutex when the object goes out of scope, making the code safer and exception-resistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use std::async?
&lt;/h3&gt;

&lt;p&gt;Instead of manually creating and managing std::thread objects, std::async provides a higher-level abstraction for asynchronous task execution.&lt;/p&gt;

&lt;p&gt;Benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automatic thread management&lt;/li&gt;
&lt;li&gt;future-based synchronization&lt;/li&gt;
&lt;li&gt;cleaner code&lt;/li&gt;
&lt;li&gt;safer resource handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Modern C++ concurrency has evolved significantly from traditional thread programming. Features such as futures, mutexes, async execution, coroutines, and task systems enable developers to write safer and more scalable concurrent applications.&lt;/p&gt;

&lt;p&gt;This small example demonstrates a foundational concept that appears everywhere in modern systems programming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;game engines&lt;/li&gt;
&lt;li&gt;rendering systems&lt;/li&gt;
&lt;li&gt;simulation frameworks&lt;/li&gt;
&lt;li&gt;CAD software&lt;/li&gt;
&lt;li&gt;scientific computing systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding synchronization primitives like mutexes is an important first step toward mastering advanced concurrent architectures in modern C++.&lt;/p&gt;

</description>
      <category>concurrency</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Class Level Locking in Java - inspired by Android's AsyncTask implementation - serializing multiple threads...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 14 May 2026 03:33:08 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/class-level-locking-in-java-inspired-by-androids-asynctask-implementation-k56</link>
      <guid>https://dev.to/sommukhopadhyay/class-level-locking-in-java-inspired-by-androids-asynctask-implementation-k56</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1xxees1k0zzpa1b6btu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1xxees1k0zzpa1b6btu.png" alt="Class Level Locking" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After many months, I have opened my Java workspace and saw my implementation of Class Level locking, which was inspired by Android's AsyncTask.&lt;/p&gt;

&lt;p&gt;Here is the source code...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.somitsolutions.java.training.classlevellockingwithstaticnestedclass&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;  
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt; &lt;span class="n"&gt;objInnerNestedClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
                    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The testMethod for "&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentThread&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" Object"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// TODO Auto-generated catch block&lt;/span&gt;
                &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.somitsolutions.java.training.classlevellockingwithstaticnestedclass&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;R&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Runnable&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt; &lt;span class="n"&gt;exampleClassObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;//final ExampleClass exampleClassObject2 = new ExampleClass();&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;exampleClassObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;objInnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; 
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.somitsolutions.java.training.classlevellockingwithstaticnestedclass&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// TODO Auto-generated method stub&lt;/span&gt;

        &lt;span class="no"&gt;R&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="no"&gt;R&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Thread 1"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Thread 2"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  1. What Exactly Is Happening Here?
&lt;/h1&gt;

&lt;p&gt;We have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt; &lt;span class="n"&gt;objInnerNestedClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line is the key.&lt;/p&gt;

&lt;p&gt;Because the object is declared &lt;code&gt;static&lt;/code&gt;, there is &lt;strong&gt;only one instance&lt;/strong&gt; of &lt;code&gt;InnerNestedClass&lt;/code&gt; for the entire JVM class &lt;code&gt;ExampleClass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No matter how many &lt;code&gt;ExampleClass&lt;/code&gt; objects you create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;they all share:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;objInnerNestedClass&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is exactly ONE monitor lock associated with that object.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Understanding the Synchronization
&lt;/h1&gt;

&lt;p&gt;Inside the nested class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the lock is acquired on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;objInnerNestedClass&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since there is only ONE static instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt; &lt;span class="n"&gt;objInnerNestedClass&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;all threads compete for the SAME monitor lock.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Flow of Execution
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step-by-step
&lt;/h2&gt;

&lt;p&gt;You create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;R&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="no"&gt;R&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each &lt;code&gt;R&lt;/code&gt; object creates its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt; &lt;span class="n"&gt;exampleClassObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Two different &lt;code&gt;ExampleClass&lt;/code&gt; objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BUT both point to the SAME static object&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExampleClass Object A
        |
        ---&amp;gt; static objInnerNestedClass ----&amp;gt; [ONE OBJECT]

ExampleClass Object B
        |
        ---&amp;gt; static objInnerNestedClass ----&amp;gt; [SAME OBJECT]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. What Happens When Threads Run?
&lt;/h1&gt;

&lt;p&gt;Thread 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;exampleClassObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;objInnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thread 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;exampleClassObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;objInnerNestedClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both are calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on the SAME shared object.&lt;/p&gt;

&lt;p&gt;Since the method is synchronized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testMethod&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;only ONE thread can enter at a time.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Runtime Behavior
&lt;/h1&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Thread 1 enters first&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thread 2 tries to enter&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 acquires monitor lock
Thread 2 BLOCKS

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thread 2 waits until:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 exits testMethod()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 2 acquires lock

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So output becomes SERIALIZED:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 messages...
Thread 1 messages...
Thread 1 messages...

THEN

Thread 2 messages...
Thread 2 messages...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of interleaving.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Why This Is Called "Class-Level Locking"
&lt;/h1&gt;

&lt;p&gt;Strictly speaking, true class-level locking is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExampleClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which locks on the &lt;code&gt;Class&lt;/code&gt; object itself.&lt;/p&gt;

&lt;p&gt;But my example achieves a VERY SIMILAR EFFECT using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static shared object + synchronized instance method

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One shared lock for entire class

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence, behaviorally, it becomes "class-wide serialization."&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Why Static Matters
&lt;/h1&gt;

&lt;p&gt;Without &lt;code&gt;static&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;InnerNestedClass&lt;/span&gt; &lt;span class="n"&gt;objInnerNestedClass&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;each &lt;code&gt;ExampleClass&lt;/code&gt; object would get its OWN nested object.&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 -&amp;gt; Lock A
Thread 2 -&amp;gt; Lock B

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No contention.&lt;/p&gt;

&lt;p&gt;Both threads would run simultaneously.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;static&lt;/code&gt; is the entire reason serialization occurs.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Relationship to Android AsyncTask
&lt;/h1&gt;

&lt;p&gt;In old Android implementations of Android AsyncTask, Google implemented task serialization using a very similar design.&lt;/p&gt;

&lt;p&gt;Internally, AsyncTask had something conceptually similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SerialExecutor&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Executor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArrayDeque&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Runnable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mTasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayDeque&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Runnable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;Runnable&lt;/span&gt; &lt;span class="n"&gt;mActive&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Runnable&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;SerialExecutor&lt;/span&gt; &lt;span class="n"&gt;sDefaultExecutor&lt;/span&gt;
        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SerialExecutor&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the same pattern:&lt;/p&gt;




&lt;h2&gt;
  
  
  Shared Static Executor
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;SerialExecutor&lt;/span&gt; &lt;span class="n"&gt;sDefaultExecutor&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ONE executor object for all AsyncTasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Synchronized Method
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only one thread could manipulate scheduling state at a time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Even if you created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MyAsyncTask&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MyAsyncTask&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MyAsyncTask&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They were serialized through the SAME shared executor.&lt;/p&gt;

&lt;p&gt;So tasks are executed one after another.&lt;/p&gt;

&lt;p&gt;This was done to avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;race conditions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;thread explosion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UI instability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uncontrolled parallelism&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;especially on low-memory mobile devices.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Why Android Did This
&lt;/h1&gt;

&lt;p&gt;Early Android phones had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;very limited RAM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;single-core CPUs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;weak scheduling capabilities&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If developers accidentally launched many background tasks simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UI freezes
Battery drain
ANRs
Memory pressure

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;could happen.&lt;/p&gt;

&lt;p&gt;So Android engineers intentionally serialized AsyncTasks.&lt;/p&gt;

&lt;p&gt;Later Android versions introduced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;executeOnExecutor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;THREAD_POOL_EXECUTOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to allow controlled parallelism.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Deeper JVM Insight
&lt;/h1&gt;

&lt;p&gt;Every Java object has an associated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monitor Lock

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a synchronized instance method is called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JVM internally does roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;monitorenter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;monitorexit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since all threads share the SAME static object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ONE monitor

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes the synchronization bottleneck.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Why Studying Open Source Code Is Important
&lt;/h1&gt;

&lt;p&gt;This is the most important part.&lt;/p&gt;

&lt;p&gt;Reading open-source frameworks teaches things that textbooks usually cannot.&lt;/p&gt;

&lt;p&gt;For example, from AsyncTask we learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;real-world concurrency design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;serialization strategies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;thread scheduling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;producer-consumer patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;executor frameworks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;synchronization tradeoffs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Theory vs Reality
&lt;/h2&gt;

&lt;p&gt;A textbook may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"synchronized prevents race conditions"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Android source code shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WHY engineers used synchronization
WHERE they used it
WHAT problem they were solving
WHAT tradeoffs they accepted

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is real engineering knowledge.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Why Great Engineers Read Source Code
&lt;/h1&gt;

&lt;p&gt;Engineers who study frameworks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OpenJDK&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux kernel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenFOAM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FreeCAD&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;develop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;architectural thinking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systems intuition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debugging maturity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;performance awareness&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;concurrency understanding&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;far beyond ordinary programming.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. What You Are Actually Learning Here
&lt;/h1&gt;

&lt;p&gt;My small example contains concepts from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JVM monitor implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;object lifetime&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;static memory model&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;synchronization semantics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;concurrent scheduling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;executor design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Android framework architecture&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly why studying framework source code is powerful.&lt;/p&gt;

&lt;p&gt;You stop seeing programming as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"writing syntax"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and begin seeing it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"designing systems"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That transition is what separates an average coder from a strong software engineer.&lt;/p&gt;

</description>
      <category>java</category>
      <category>concurrentprogramming</category>
    </item>
    <item>
      <title>Walking Alone, Building Bharat: Why Intrinsic Motivation Defines the Future of Innovation</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sat, 09 May 2026 05:32:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/walking-alone-building-bharat-why-intrinsic-motivation-defines-the-future-of-innovation-14nj</link>
      <guid>https://dev.to/sommukhopadhyay/walking-alone-building-bharat-why-intrinsic-motivation-defines-the-future-of-innovation-14nj</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/TZ5pnsLKR8Q"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;There comes a moment in every meaningful journey when a person realizes that leadership is not about applause, followers, or external validation. It is about conviction. It is about walking forward even when nobody accompanies you.&lt;/p&gt;

&lt;p&gt;The timeless line from Ekla Chalo Re captures this spirit perfectly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If nobody responds to your call, then walk alone.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not merely poetry. It is a philosophy of leadership.&lt;/p&gt;

&lt;p&gt;A true leader does not wait for social approval before pursuing truth, innovation, or transformation. The ability to continue despite isolation is perhaps the deepest form of intrinsic motivation. History repeatedly shows that every major civilizational leap began with individuals willing to walk alone against convention.&lt;/p&gt;

&lt;p&gt;Today, this mindset is becoming increasingly visible across India — or as many passionately call it, Bharat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rise of a New Bharat
&lt;/h2&gt;

&lt;p&gt;A profound transformation is underway.&lt;/p&gt;

&lt;p&gt;For decades, elite education in India was concentrated in a few urban centers. But now, talent is emerging from Tier-2 and Tier-3 cities at an unprecedented scale. Access to knowledge is no longer geographically restricted.&lt;/p&gt;

&lt;p&gt;The digital revolution has changed the equation.&lt;/p&gt;

&lt;p&gt;Online education, open-source learning, recorded lectures from institutions like Indian Institutes of Technology, National Institutes of Technology, and other premier institutions are democratizing technical education.&lt;/p&gt;

&lt;p&gt;The implications are enormous.&lt;/p&gt;

&lt;p&gt;If a classroom of twenty students in a top engineering institution can produce two or three future entrepreneurs or researchers, what happens when world-class technical education reaches millions of students across the country through the internet?&lt;/p&gt;

&lt;p&gt;The answer is simple:&lt;br&gt;&lt;br&gt;
India’s innovation capacity multiplies exponentially.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Examination Factories to Knowledge Civilization
&lt;/h2&gt;

&lt;p&gt;For years, one criticism often directed toward India was that the country produced service-sector engineers but lacked large-scale original research and deep technological innovation.&lt;/p&gt;

&lt;p&gt;That narrative is beginning to change.&lt;/p&gt;

&lt;p&gt;The future belongs to nations capable of producing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;researchers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deep-tech innovators,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hardware engineers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;graphics programmers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI scientists,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;simulation experts,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;entrepreneurs,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and creators of foundational technology.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;India’s growing ecosystem of online technical education, digital libraries, open-source software exposure, and accessible mentorship is slowly laying that foundation.&lt;/p&gt;

&lt;p&gt;The next generation is not satisfied with merely consuming technology. They want to build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Small Example of a Bigger Transformation
&lt;/h2&gt;

&lt;p&gt;One of the most striking parts of this story is that the transformation is already visible at the school level.&lt;/p&gt;

&lt;p&gt;My son, a Class 9 student, who began learning programming at the age of six. Over time, he explored multiple programming languages, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Java&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, his interest moved toward advanced graphics programming using OpenGL.&lt;/p&gt;

&lt;p&gt;But the remarkable aspect was not simply learning OpenGL.&lt;/p&gt;

&lt;p&gt;Ridit reportedly went further by exposing a custom C++ OpenGL engine to Python using pybind11 — a concept normally encountered in advanced software engineering and systems programming.&lt;/p&gt;

&lt;p&gt;This is significant because it reflects something deeper:&lt;br&gt;&lt;br&gt;
Young learners are no longer limiting themselves to textbook knowledge. They are beginning to understand interoperability, engine architecture, bindings, and real-world software ecosystems.&lt;/p&gt;

&lt;p&gt;This is precisely how technological civilizations evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Internet Has Changed the Nature of Talent
&lt;/h2&gt;

&lt;p&gt;In previous generations, access to elite knowledge depended heavily on geography, institutional privilege, or economic background.&lt;/p&gt;

&lt;p&gt;Today, a motivated student with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a computer,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internet access,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;curiosity,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and discipline&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can study subjects that were once accessible only to specialists.&lt;/p&gt;

&lt;p&gt;From graphics programming to AI, from computational physics to simulation engineering, the barriers are steadily falling.&lt;/p&gt;

&lt;p&gt;This democratization of technical capability may become one of the defining developments of 21st-century India.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intrinsic Motivation: The Real National Resource
&lt;/h2&gt;

&lt;p&gt;Natural resources matter.&lt;br&gt;&lt;br&gt;
Infrastructure matters.&lt;br&gt;&lt;br&gt;
Capital matters.&lt;/p&gt;

&lt;p&gt;But civilizations ultimately rise through motivated human beings.&lt;/p&gt;

&lt;p&gt;Intrinsic motivation — the inner drive to learn, create, solve problems, and pursue truth without external reward — is the invisible force behind every scientific and technological revolution.&lt;/p&gt;

&lt;p&gt;A nation that cultivates intrinsically motivated students will eventually produce innovators.&lt;/p&gt;

&lt;p&gt;And innovators create industries.&lt;br&gt;&lt;br&gt;
Industries create economic power.&lt;br&gt;&lt;br&gt;
Economic power creates strategic independence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walking Alone Before Others Join
&lt;/h2&gt;

&lt;p&gt;Every new idea initially appears isolated.&lt;/p&gt;

&lt;p&gt;Every breakthrough begins with a small number of believers.&lt;/p&gt;

&lt;p&gt;The message is simple:&lt;br&gt;&lt;br&gt;
do not wait for universal approval before beginning meaningful work.&lt;/p&gt;

&lt;p&gt;Whether in science, software, engineering, entrepreneurship, or national development, progress often starts with individuals willing to move forward before the crowd understands the direction.&lt;/p&gt;

&lt;p&gt;That is leadership.&lt;/p&gt;

&lt;p&gt;And perhaps that is the deeper meaning of “walk alone.”&lt;/p&gt;

&lt;p&gt;Because eventually, if the path is true, others follow.&lt;/p&gt;

&lt;p&gt;Jai Hind... Jai Bharat...&lt;/p&gt;

</description>
      <category>youngprogrammer</category>
      <category>pybind</category>
      <category>cpp</category>
      <category>opengl</category>
    </item>
    <item>
      <title>Ancient Logic Meets Early AI: The Surprising Parallels Between Prolog and Sanskrit - Engineers of Bharat, wake up and embrace Sanskrit</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:48:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/ancient-logic-meets-early-ai-the-surprising-parallels-between-prolog-and-sanskrit-engineers-of-4eaj</link>
      <guid>https://dev.to/sommukhopadhyay/ancient-logic-meets-early-ai-the-surprising-parallels-between-prolog-and-sanskrit-engineers-of-4eaj</guid>
      <description>&lt;p&gt;When we think about Artificial Intelligence, we usually picture modern neural networks, GPUs, and massive datasets. But the intellectual roots of AI go much deeper—into symbolic reasoning, formal logic, and surprisingly, ancient linguistic traditions. One of the most fascinating comparisons is between early AI systems built using Prolog and the structure of Sanskrit, one of the oldest and most rigorously defined languages in human history.&lt;/p&gt;

&lt;p&gt;This is not a superficial analogy. At a structural and philosophical level, both Prolog and Sanskrit share striking similarities in how they represent knowledge, rules, and inference.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Rule-Based Systems: Sutras vs Clauses
&lt;/h3&gt;

&lt;p&gt;Early AI systems, especially those built in Prolog, rely heavily on &lt;strong&gt;rules and facts&lt;/strong&gt;. A Prolog program is essentially a knowledge base composed of logical clauses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Facts: Statements that are always true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rules: Conditional relationships that derive new truths&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Similarly, Sanskrit—especially as formalized by the ancient grammarian Pāṇini—is built on a system of &lt;strong&gt;sutras (rules)&lt;/strong&gt;. These are concise, highly optimized statements that define how words are formed and how grammar operates.&lt;/p&gt;

&lt;p&gt;Both systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Encode knowledge as &lt;strong&gt;compact rules&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow complex structures to emerge from simple primitives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depend on &lt;strong&gt;rule application rather than procedural steps&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a sense, Pāṇini’s grammar can be viewed as one of the earliest known “programs.”&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Declarative Nature
&lt;/h3&gt;

&lt;p&gt;Prolog is a &lt;strong&gt;declarative language&lt;/strong&gt;. You don’t tell the system &lt;em&gt;how&lt;/em&gt; to solve a problem—you tell it &lt;em&gt;what is true&lt;/em&gt;, and the system figures out the rest through logical inference.&lt;/p&gt;

&lt;p&gt;Sanskrit grammar operates similarly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It defines &lt;strong&gt;what constitutes valid language&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not prescribe step-by-step generation in a procedural sense&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead, valid expressions are derived through rule application&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This declarative paradigm is fundamentally different from imperative programming—and both Prolog and Sanskrit embody it elegantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pattern Matching and Unification
&lt;/h3&gt;

&lt;p&gt;One of the core mechanisms in Prolog is &lt;strong&gt;unification&lt;/strong&gt; —a process of matching patterns and binding variables to satisfy logical conditions.&lt;/p&gt;

&lt;p&gt;Example (conceptually):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The system tries to match patterns and infer relationships.&lt;/p&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Word formation and sentence construction involve &lt;strong&gt;pattern transformations&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Roots (dhatus) combine with suffixes following strict matching rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Morphological changes depend on context-sensitive patterns&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This resembles a form of linguistic unification, where structures are matched and transformed based on rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Backtracking and Multiple Interpretations
&lt;/h3&gt;

&lt;p&gt;Prolog uses &lt;strong&gt;backtracking&lt;/strong&gt; to explore multiple possible solutions. If one path fails, it goes back and tries another.&lt;/p&gt;

&lt;p&gt;Sanskrit, especially in classical literature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Allows multiple valid interpretations of a sentence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meaning can depend on context, case endings, and word order&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ambiguity is resolved through structured inference&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While Sanskrit doesn’t “execute” backtracking computationally, its structure supports &lt;strong&gt;multi-path interpretation&lt;/strong&gt; , similar to logical exploration in Prolog.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Compositionality and Generative Power
&lt;/h3&gt;

&lt;p&gt;Both systems are highly &lt;strong&gt;compositional&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In Prolog, small rules combine to solve complex problems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Sanskrit, small grammatical units combine to generate vast expressive possibilities&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This compositional nature leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Scalability of expression&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elegant reuse of rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High generative capacity from limited primitives&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  6. Knowledge Representation
&lt;/h3&gt;

&lt;p&gt;Prolog was designed for &lt;strong&gt;symbolic AI&lt;/strong&gt; , where knowledge is explicitly represented and reasoned about.&lt;/p&gt;

&lt;p&gt;Sanskrit, particularly in philosophical and scientific texts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Encodes knowledge in a structured, rule-based format&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintains clarity and precision in meaning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supports logical discourse in fields like mathematics, astronomy, and philosophy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes Sanskrit not just a language, but a &lt;strong&gt;knowledge representation system&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Minimalism and Compression
&lt;/h3&gt;

&lt;p&gt;Pāṇini’s grammar is famous for its &lt;strong&gt;extreme brevity&lt;/strong&gt;. Rules are compressed using meta-rules, recursion, and symbolic shorthand.&lt;/p&gt;

&lt;p&gt;Prolog also encourages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Minimal representations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reusable logic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compact expression of complex relationships&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both systems aim for &lt;strong&gt;maximum expressiveness with minimal redundancy&lt;/strong&gt; —a hallmark of elegant design.&lt;/p&gt;
&lt;h3&gt;
  
  
  8. Philosophical Foundations
&lt;/h3&gt;

&lt;p&gt;At a deeper level, both Prolog and Sanskrit emerge from traditions that value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logic over procedure&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structure over execution&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inference over instruction&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prolog comes from formal logic and computational theory. Sanskrit emerges from a philosophical tradition deeply concerned with language, meaning, and cognition.&lt;/p&gt;

&lt;p&gt;The convergence is not accidental—it reflects a shared pursuit of &lt;strong&gt;modeling intelligence through structure&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Conclusion: Rediscovering Intelligence Through Structure
&lt;/h3&gt;

&lt;p&gt;Modern AI has largely shifted toward data-driven approaches like deep learning. But the comparison between Prolog and Sanskrit reminds us of an alternative vision of intelligence—one rooted in &lt;strong&gt;rules, logic, and symbolic reasoning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For developers, linguists, and AI researchers, this intersection offers a powerful insight:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Intelligence is not just about learning patterns from data—it is also about representing and manipulating knowledge with precision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In that sense, ancient Sanskrit and early AI are not distant domains—they are parallel explorations of the same fundamental question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can structured rules give rise to intelligent behavior?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If we revisit these ideas with modern tools, we may find that the future of AI is not just in neural networks—but also in rediscovering the elegance of symbolic systems that civilizations mastered thousands of years ago.&lt;/p&gt;

&lt;p&gt;Let’s make this concrete with a small &lt;strong&gt;Prolog program&lt;/strong&gt; , and then examine it through the lens of &lt;strong&gt;Sanskrit grammar and structure&lt;/strong&gt; —not as a metaphor, but as a structural comparison.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 A Simple Prolog Program
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="c1"&gt;% Facts&lt;/span&gt;
&lt;span class="ss"&gt;father&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;shyam&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;father&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sita&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;gita&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;shyam&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;gita&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sita&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Rule&lt;/span&gt;
&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;father&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;span class="c1"&gt;% Rule for sibling relationship&lt;/span&gt;
&lt;span class="ss"&gt;sibling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  What this program does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Defines &lt;strong&gt;facts&lt;/strong&gt; about family relationships&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Defines &lt;strong&gt;rules&lt;/strong&gt; to infer:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example query:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="o"&gt;?-&lt;/span&gt; &lt;span class="ss"&gt;sibling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;shyam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sita&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;true.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Now: Analysis Through the Lens of Sanskrit
&lt;/h1&gt;

&lt;p&gt;We’ll map key Prolog concepts to structural principles found in Sanskrit, especially in the grammatical system of &lt;strong&gt;Pāṇini&lt;/strong&gt; and his work, the &lt;strong&gt;Ashtadhyayi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Facts as “Pratijñā” (Given Truths)
&lt;/h2&gt;

&lt;p&gt;In Prolog:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;father&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;shyam&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is an &lt;strong&gt;atomic truth&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This resembles a &lt;strong&gt;semantic assertion&lt;/strong&gt; , like:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Paninian system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Such statements are not “computed”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They are &lt;strong&gt;accepted inputs to the system&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prolog facts = &lt;strong&gt;Given semantic truths (pratijñā-like statements)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Rules as Sutras (सूत्र)
&lt;/h2&gt;

&lt;p&gt;Prolog rule:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;father&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;X is a parent of Y &lt;strong&gt;if&lt;/strong&gt; X is a father of Y&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Sanskrit grammar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;sutra&lt;/strong&gt; defines transformation or classification rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example idea (not literal):&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Both share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Conditional structure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Minimal expression&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High reuse&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Key insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prolog rules behave like &lt;strong&gt;generative sutras&lt;/strong&gt; —they don’t store outcomes, they define &lt;strong&gt;how to derive them&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Variables as “Anubandha” (Markers / Placeholders)
&lt;/h2&gt;

&lt;p&gt;In Prolog:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;X and Y are placeholders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Sanskrit grammar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pāṇini uses &lt;strong&gt;markers (anubandhas)&lt;/strong&gt; and abstract symbols&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These are not actual words but &lt;strong&gt;meta-linguistic variables&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prolog variables ≈ &lt;strong&gt;Paninian symbolic placeholders&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do not carry meaning themselves&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gain meaning through substitution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  4. Unification vs Sandhi / Morphological Matching
&lt;/h2&gt;

&lt;p&gt;Prolog uses &lt;strong&gt;unification&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It tries to match:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Word formation uses &lt;strong&gt;rule-based matching&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prolog unification ≈ &lt;strong&gt;rule-based linguistic matching&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Depend on &lt;strong&gt;pattern compatibility&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply transformations only when constraints are satisfied&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  5. Backtracking vs Interpretive Flexibility
&lt;/h2&gt;

&lt;p&gt;In Prolog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If one rule fails, it &lt;strong&gt;backtracks&lt;/strong&gt; and tries another&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A sentence can allow &lt;strong&gt;multiple valid parses&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meaning emerges from:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Word order is flexible, but meaning is preserved via rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prolog backtracking ≈ &lt;strong&gt;multi-path interpretation in Sanskrit parsing&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  6. The Sibling Rule as a Composite Sutra
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;sibling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:-&lt;/span&gt; &lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It composes multiple rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduces a constraint&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex constructions emerge from:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This resembles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;compound rule application (samāsa-like compositionality)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  7. Negation Constraint (X = Y)
&lt;/h2&gt;

&lt;p&gt;This part:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="nv"&gt;X&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X and Y must be different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;There are &lt;strong&gt;blocking rules&lt;/strong&gt; (नियम / प्रतिबंध)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Certain forms are &lt;strong&gt;prevented&lt;/strong&gt; under specific conditions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logical negation ≈ &lt;strong&gt;grammatical restriction rules&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  8. Knowledge Emergence
&lt;/h2&gt;

&lt;p&gt;Important insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nowhere did we explicitly define:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prolog"&gt;&lt;code&gt;&lt;span class="ss"&gt;sibling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;shyam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sita&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Yet it emerges.&lt;/p&gt;

&lt;p&gt;In Sanskrit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infinite valid sentences are generated from:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Both systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are &lt;strong&gt;generative, not enumerative&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Deep Insight: Computation vs Derivation
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Prolog&lt;/th&gt;
&lt;th&gt;Sanskrit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge&lt;/td&gt;
&lt;td&gt;Stored as facts&lt;/td&gt;
&lt;td&gt;Encoded via roots &amp;amp; meanings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules&lt;/td&gt;
&lt;td&gt;Logical clauses&lt;/td&gt;
&lt;td&gt;Sutras&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;Query resolution&lt;/td&gt;
&lt;td&gt;Derivation (prakriya)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engine&lt;/td&gt;
&lt;td&gt;Backtracking search&lt;/td&gt;
&lt;td&gt;Rule ordering + constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;Logical truth&lt;/td&gt;
&lt;td&gt;Valid linguistic expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;If you look carefully, this Prolog program is not “code” in the modern imperative sense.&lt;/p&gt;

&lt;p&gt;It is closer to a &lt;strong&gt;derivation system&lt;/strong&gt; —and that is exactly what Sanskrit grammar is.&lt;/p&gt;

&lt;p&gt;👉 Both answer the same deep question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can a finite set of rules generate an infinite space of valid structures?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s why many researchers—from early AI pioneers to modern computational linguists—have seen Sanskrit not just as a language, but as a &lt;strong&gt;formal system of knowledge representation&lt;/strong&gt; , remarkably aligned with symbolic AI like Prolog.&lt;/p&gt;

&lt;p&gt;Read ON...&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://drive.google.com/file/d/1KNKwI2Gomgre8UmTRN8k0_vm7bxtGxQz/view?usp=sharing" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdrive.google.com%2Fdrive-viewer%2FAKGpihaNpj935EMSoo9g2FyYqLkPPqElAqT48T8YxPMoXlkCneJHrcYvrwVYy6cMiPvn3SN-Lfq0gMprZ3lTiysuQXEAkThNWwlVknk%3Ds1600-rw-v1" height="" class="m-0" width=""&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1KNKwI2Gomgre8UmTRN8k0_vm7bxtGxQz/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            knowledge representation in Sanskrit and AI.pdf - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fimages%2Fbranding%2Fproduct%2F1x%2Fdrive_2020q4_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>prolog</category>
      <category>sanskrit</category>
      <category>bharat</category>
    </item>
    <item>
      <title>Active Object Design Pattern, implemented using Julia - from Active Object paradigm of Symbian S60 to today's journey in Julia</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 17 Apr 2026 10:36:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/active-object-design-pattern-implemented-using-julia-from-active-object-paradigm-of-symbian-s60-59l0</link>
      <guid>https://dev.to/sommukhopadhyay/active-object-design-pattern-implemented-using-julia-from-active-object-paradigm-of-symbian-s60-59l0</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Active Object Design Pattern&lt;/strong&gt; is a concurrency pattern that decouples method invocation from method execution, allowing tasks to run asynchronously without blocking the caller.&lt;/p&gt;

&lt;p&gt;At its core, an Active Object introduces a &lt;strong&gt;proxy&lt;/strong&gt; that clients interact with. Instead of executing methods directly, the proxy places requests into a &lt;strong&gt;queue&lt;/strong&gt;. A separate &lt;strong&gt;worker thread (or pool)&lt;/strong&gt; processes these requests in the background. This creates a clean separation between &lt;em&gt;what&lt;/em&gt; needs to be done and &lt;em&gt;when/how&lt;/em&gt; it gets executed.&lt;/p&gt;

&lt;p&gt;A typical Active Object system has four key components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proxy&lt;/strong&gt; – exposes the interface to the client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Method Request&lt;/strong&gt; – encapsulates a function call as an object or callable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activation Queue&lt;/strong&gt; – holds pending requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scheduler/Worker&lt;/strong&gt; – executes requests asynchronously&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is especially useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You want to &lt;strong&gt;avoid blocking&lt;/strong&gt; the main thread&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need &lt;strong&gt;controlled concurrency&lt;/strong&gt; (e.g., limited worker threads)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You want to &lt;strong&gt;serialize access&lt;/strong&gt; to shared resources safely&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a simple implementation of Active Object Design Pattern in Julia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; ThreadedActiveObject&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nworkers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nworkers&lt;/span&gt;
        &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;
                &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invokelatest&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; heavy_compute&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Computed sum for &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;n = &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;s on thread &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(Threads.threadid())"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ThreadedActiveObject&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;heavy_compute&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;foreach&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Sequence Diagram:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjqnl8cmpyfgz3uec8q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjqnl8cmpyfgz3uec8q8.png" alt="Sequence Diagram of Active Object Pattern" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Mapping The Code to Active Object Components
&lt;/h1&gt;

&lt;p&gt;Let’s reinterpret the code piece by piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proxy (Client Interface)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;heavy&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_compute&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the  &lt;strong&gt;proxy layer&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The caller is &lt;strong&gt;not executing the method directly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Instead, it:

&lt;ul&gt;
&lt;li&gt;wraps the request as a function (closure)&lt;/li&gt;
&lt;li&gt;submits it to a queue&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In classic Active Object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
proxy.method\_call() → enqueue request

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_function&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Channel (&lt;code&gt;ao&lt;/code&gt;) acts as the proxy interface&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Activation Queue
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the &lt;strong&gt;Activation Queue&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Holds pending method requests&lt;/li&gt;
&lt;li&gt;Thread-safe&lt;/li&gt;
&lt;li&gt;Decouples producer and consumer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classic role:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="x"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each &lt;code&gt;Function&lt;/code&gt; = a &lt;strong&gt;method request object&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Method Request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="x"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;heavy&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_compute&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a &lt;strong&gt;Method Request object&lt;/strong&gt; , just expressed as a closure.&lt;/p&gt;

&lt;p&gt;In traditional OO:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PrintTask&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MethodRequest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Julia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="x"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;heavy&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_compute&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encapsulates:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;what to do&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data (i)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;logic&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scheduler + Servant (Worker Threads)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;  
 &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;  
 &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invokelatest&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  
 &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This block plays &lt;strong&gt;two roles&lt;/strong&gt; :&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduler
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pulls requests from the queue&lt;/li&gt;
&lt;li&gt;Decides execution order (FIFO here)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the  &lt;strong&gt;scheduler&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Servant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invokelatest&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Actually executes the request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the  &lt;strong&gt;servant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So each worker thread is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[Scheduler + Servant]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Thread Pool (Multiple Active Objects Workers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nworkers&lt;/span&gt;  
 &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creates multiple workers&lt;/li&gt;
&lt;li&gt;All consume from the same queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a &lt;strong&gt;multi-threaded Active Object&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Classic pattern often has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 thread → 1 active object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My version:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;N threads → shared activation queue&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is more like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active Object + Thread Pool hybrid&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lifecycle Control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Closing the queue
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ao&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Signals: no more requests&lt;/li&gt;
&lt;li&gt;Workers stop after finishing remaining jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Waiting for completion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;foreach&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Ensures all scheduled work is completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's my journey through the Symbian S60's Active Object paradigm - studied many years ago...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztbhx4j366nkcctyi0sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztbhx4j366nkcctyi0sa.png" alt="Active Object Symbian" width="800" height="450"&gt;&lt;/a&gt;&lt;a href="https://som-itsolutions.blogspot.com/2008/09/when-i-started-understanding-active.html" rel="noopener noreferrer"&gt;Active Object Symbian&lt;/a&gt;&lt;/p&gt;

</description>
      <category>concurrency</category>
      <category>posa</category>
      <category>designpattern</category>
    </item>
    <item>
      <title>A story on my checkered software journey through the wilderness of concurrent programming - one important lesson - basic idea...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Fri, 17 Apr 2026 05:20:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/a-story-on-my-checkered-software-journey-through-the-wilderness-of-concurrent-programming-one-14ph</link>
      <guid>https://dev.to/sommukhopadhyay/a-story-on-my-checkered-software-journey-through-the-wilderness-of-concurrent-programming-one-14ph</guid>
      <description>&lt;p&gt;There’s a certain kind of journey that doesn’t show up on résumés—the kind that winds through late nights, cryptic bugs, half-working abstractions, and those rare moments when something finally &lt;em&gt;clicks&lt;/em&gt;. My journey through concurrent programming has been exactly that: a long walk through a wilderness where the landscape keeps changing, but the underlying terrain remains strangely familiar.&lt;/p&gt;

&lt;p&gt;I started in the era of VC++. Back then, concurrency felt mechanical—almost industrial. I didn’t “design” concurrent systems; I wrestled them into submission. &lt;code&gt;WAIT_FOR_SINGLE_OBJECT&lt;/code&gt;, &lt;code&gt;WAIT_FOR_MULTIPLE_OBJECTS&lt;/code&gt;—these weren’t just API calls to me; they were survival tools. I learned quickly that a missed signal or a mishandled handle could freeze everything into a silent deadlock. Threads were powerful, yes—but also unforgiving. I treated them with respect because I had no choice.&lt;/p&gt;

&lt;p&gt;Then I encountered Symbian, and with it, the idea of Active Objects. That was a turning point for me. Instead of manually juggling threads, I began thinking in terms of events, schedulers, and requests. The system was still concurrent, but the chaos felt… organized. I wasn’t blocking threads anymore; I was orchestrating asynchronous flows. It felt like moving from brute force to something more deliberate.&lt;/p&gt;

&lt;p&gt;It wasn’t effortless, though. The Active Object model demanded discipline. I had to understand request lifecycles, callbacks, and the implicit contract with the scheduler. But once it clicked, it changed how I saw concurrency—not just as parallel execution, but as controlled responsiveness.&lt;/p&gt;

&lt;p&gt;Then came Android and Java. By that time, concurrency had evolved into something more structured. Executors, thread pools, futures, synchronized blocks—the tools were richer, the abstractions deeper. I could finally express intent more clearly: &lt;em&gt;run this task&lt;/em&gt;, &lt;em&gt;schedule that work&lt;/em&gt;, &lt;em&gt;wait for these results&lt;/em&gt;. The raw edges of thread management were softened.&lt;/p&gt;

&lt;p&gt;But I also realized something important: the old problems never really went away. Deadlocks still happened. Race conditions still crept in. Performance was still a careful balancing act. The tools had improved, but the responsibility was still mine.&lt;/p&gt;

&lt;p&gt;And then I found Julia.&lt;/p&gt;

&lt;p&gt;Julia felt different from the start. Lightweight tasks, channels, &lt;code&gt;@async&lt;/code&gt;, &lt;code&gt;Threads.@spawn&lt;/code&gt;—it was concurrency with a kind of fluidity I hadn’t experienced before. I could write code that looked almost sequential, yet behaved concurrently. Channels made communication feel natural again.&lt;/p&gt;

&lt;p&gt;I remember watching tasks communicate over a channel, work flowing across threads, and thinking—this feels like everything I’ve learned, coming together. The low-level discipline from VC++, the event-driven thinking from Symbian, the structured abstractions from Java—they were all there, just distilled into something simpler and more expressive.&lt;/p&gt;

&lt;p&gt;That’s when the most important lesson became clear to me.&lt;/p&gt;

&lt;p&gt;Across all these platforms, languages, and paradigms—the surface keeps changing. APIs evolve. Syntax improves. Abstractions come and go.&lt;/p&gt;

&lt;p&gt;But the core idea doesn’t change.&lt;/p&gt;

&lt;p&gt;At its heart, concurrent programming has always been about a few simple truths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Work can happen independently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coordination is harder than execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Communication is everything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And timing… timing is where things either work beautifully or fall apart.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether I’m waiting on a kernel object, scheduling an active request, submitting tasks to an executor, or passing messages through a channel—I’m solving the same fundamental problem. I’m managing &lt;em&gt;time&lt;/em&gt;, &lt;em&gt;state&lt;/em&gt;, and &lt;em&gt;interaction&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The wilderness hasn’t disappeared for me. I’ve just learned how to navigate it.&lt;/p&gt;

&lt;p&gt;And maybe that’s what this journey really is—not moving from one technology to another, but moving from confusion to clarity. From fighting concurrency… to understanding it.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>devjournal</category>
      <category>learning</category>
      <category>programming</category>
    </item>
    <item>
      <title>Inter-thread communication in Julia - Channel and Wait-Notify...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Thu, 16 Apr 2026 02:55:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/inter-thread-communication-in-julia-channel-and-wait-notify-4bfa</link>
      <guid>https://dev.to/sommukhopadhyay/inter-thread-communication-in-julia-channel-and-wait-notify-4bfa</guid>
      <description>&lt;p&gt;There are a few ways we can accomplish inter-thread communication in Julia. In this article, we will look into two ways - via &lt;strong&gt;channel&lt;/strong&gt; and via &lt;strong&gt;wait &amp;amp; notify.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Via Channel...
&lt;/h1&gt;

&lt;p&gt;Here's an implementation of the Producer-Consumer problem in Julia using two threads. The producer creates and puts it in a channel, whereas the consumer takes it from the channel. The producer and consumer run in two different threads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Threads&lt;/span&gt;

&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;

&lt;span class="c"&gt;# Producer (runs on a thread)&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
            &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Producing &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;i on thread &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(threadid())"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c"&gt;# Consumer (runs on another thread)&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;
            &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Consuming &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;val on thread &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(threadid())"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's try to dissect the above code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Idea: Channels are &lt;em&gt;Iterable Streams&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;In Julia, a &lt;code&gt;Channel&lt;/code&gt; is not just a queue—it implements the &lt;strong&gt;iteration protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when we write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Consuming &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;val on thread &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(threadid())"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this is &lt;em&gt;conceptually equivalent&lt;/em&gt; to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;take!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# blocks if empty&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Consuming &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;val on thread &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(threadid())"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…but with one crucial addition:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The loop automatically stops when the channel is closed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Happens Internally
&lt;/h2&gt;

&lt;p&gt;When Julia executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it translates roughly into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iterate&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nb"&gt;nothing&lt;/span&gt;
    &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iterate&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;code&gt;Channel&lt;/code&gt;, &lt;code&gt;iterate(ch)&lt;/code&gt; is defined such that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It internally calls &lt;code&gt;take!(ch)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If data is available → returns &lt;code&gt;(value, state)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the channel is:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This is Perfect for Concurrency
&lt;/h2&gt;

&lt;p&gt;Let’s break down the behavior in your example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Producer Thread
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pushes data into the channel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the channel buffer is full → &lt;strong&gt;producer blocks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Consumer Thread
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If data is available → consumes immediately&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If empty → &lt;strong&gt;consumer blocks (non-busy wait!)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If channel is closed → loop exits cleanly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Important: This is NOT Busy Waiting
&lt;/h2&gt;

&lt;p&gt;A common mistake in other languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* spin */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Julia does this instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The consumer &lt;strong&gt;yields control&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The scheduler runs another task&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;put!&lt;/code&gt; happens → consumer is resumed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;cooperative scheduling&lt;/strong&gt; , not CPU spinning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;for val in ch&lt;/code&gt; is Better Than &lt;code&gt;take!&lt;/code&gt; Loop
&lt;/h2&gt;

&lt;p&gt;We  &lt;em&gt;could&lt;/em&gt; write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;take!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But then we must manually handle termination:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How do we know when to stop?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We'd need a sentinel value or extra signaling&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatic blocking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic wake-up&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic termination on &lt;code&gt;close(ch)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cleaner, declarative code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Role of &lt;code&gt;close(ch)&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This line in our producer is critical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The consumer will &lt;strong&gt;wait forever&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Because it assumes more data might come&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The iteration ends naturally&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;for&lt;/code&gt; loop exits → task completes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Subtle but Important Detail
&lt;/h2&gt;

&lt;p&gt;Even though we used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The channel itself is &lt;strong&gt;thread-safe&lt;/strong&gt; , meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Multiple producers/consumers can safely operate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Synchronization is handled internally&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;Consumer code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not just syntactic sugar—it encodes three things at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blocking synchronization&lt;/strong&gt; (wait for data)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data flow semantics&lt;/strong&gt; (consume stream)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Termination protocol&lt;/strong&gt; (stop on close)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s why it’s considered &lt;em&gt;idiomatic Julia concurrency&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Via Event/Condition
&lt;/h1&gt;

&lt;p&gt;This is pretty good for implementing signalling between threads.&lt;/p&gt;

&lt;p&gt;Here's the code for such a system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Threads&lt;/span&gt;

&lt;span class="n"&gt;mtx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;ReentrantLock&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenericCondition&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;#bind lock + condition&lt;/span&gt;

&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
            &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Now Waiting on a condition and will wake up only when that condition will be signalled..."&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cond&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;#correct lock&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Now again Resuming!"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
            &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cond&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;     &lt;span class="c"&gt;#SAME lock&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Idea
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;Condition&lt;/code&gt; in Julia is a &lt;strong&gt;wait queue tied to a lock&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Threads can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;wait(cond)&lt;/strong&gt; → sleep until signaled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;notify(cond)&lt;/strong&gt; → wake waiting thread(s)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What happens in the code?
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Prints numbers &lt;code&gt;1 → 5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acquires lock and calls:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Releases &lt;code&gt;mtx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Goes to sleep&lt;/li&gt;
&lt;li&gt;Gets queued on &lt;code&gt;cond&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The thread is now &lt;strong&gt;blocked without consuming CPU&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Thread (Producer / Notifier)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  

&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  
 &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cond&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What happens:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;After 10 seconds, main thread:

&lt;ul&gt;
&lt;li&gt;Acquires the same lock (&lt;code&gt;mtx&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;notify(cond)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This:

&lt;ul&gt;
&lt;li&gt;Wakes the waiting thread&lt;/li&gt;
&lt;li&gt;That thread re-acquires the lock&lt;/li&gt;
&lt;li&gt;Continues execution&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Execution Timeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Worker Thread Main Thread  
-------------- -------------  
1 → 5 printed  
Now Waiting...  
(wait → sleep)  

 sleep(10)  
 notify(cond)  

Resuming!  
6 → 10 printed

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Critical Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Lock must be held
&lt;/h3&gt;

&lt;p&gt;Both must be inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;ConcurrencyViolationError&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"lock must be held"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Same lock everywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;cond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenericCondition&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtx&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You must use &lt;strong&gt;this exact &lt;code&gt;mtx&lt;/code&gt;&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wait&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notify&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;wait&lt;/code&gt; is atomic
&lt;/h3&gt;

&lt;p&gt;When calling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cond&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Julia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Releases lock&lt;/li&gt;
&lt;li&gt;Sleeps&lt;/li&gt;
&lt;li&gt;On notify → wakes up&lt;/li&gt;
&lt;li&gt;Re-acquires lock&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This avoids race conditions&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceptual Model
&lt;/h2&gt;

&lt;p&gt;Think of it like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Condition = Lock + Queue of waiting threads

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;wait&lt;/code&gt; → join queue&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;notify&lt;/code&gt; → wake one (or all)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to use this?
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;Condition variables&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;pure signaling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No data needs to be transferred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;strong&gt;Channel&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;data + synchronization&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>coding</category>
      <category>computerscience</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>@async in Julia is not parallelism - but @Thread.spawn is...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:12:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/async-in-julia-is-not-parallelism-but-threadspawn-is-16hb</link>
      <guid>https://dev.to/sommukhopadhyay/async-in-julia-is-not-parallelism-but-threadspawn-is-16hb</guid>
      <description>&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Julia&lt;/strong&gt; , &lt;code&gt;@async&lt;/code&gt; gives you &lt;strong&gt;concurrency&lt;/strong&gt; , not &lt;strong&gt;parallelism&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@async&lt;/code&gt; → runs multiple tasks, but on the &lt;strong&gt;same thread&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Threads.@spawn&lt;/code&gt; → runs tasks on &lt;strong&gt;multiple CPU threads (true parallelism)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demonstration 1
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;name running on thread "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
     &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;name finished on thread "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="nd"&gt;@async&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task A"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="nd"&gt;@async&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task B"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run the above code, we will get &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task A running on thread 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task B running on thread 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task A finished on thread 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task B finished on thread 1&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is happening internally?
&lt;/h2&gt;

&lt;p&gt;Julia uses &lt;strong&gt;cooperative scheduling&lt;/strong&gt; for &lt;code&gt;@async&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks &lt;strong&gt;yield control&lt;/strong&gt; (e.g., &lt;code&gt;sleep&lt;/code&gt;, I/O)&lt;/li&gt;
&lt;li&gt;Scheduler switches between them&lt;/li&gt;
&lt;li&gt;But execution remains on &lt;strong&gt;one OS thread&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see from the output, both tasks are running on the same thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstration 2
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="c"&gt;#parallelism using multiple Threads&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;name running on thread "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;name finished on thread "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task A"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task B"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run the above code, we will get&lt;/p&gt;

&lt;p&gt;Task B running on thread 3&lt;/p&gt;

&lt;p&gt;Task A running on thread 4&lt;/p&gt;

&lt;p&gt;Task B finished on thread 3&lt;/p&gt;

&lt;p&gt;Task A finished on thread 4&lt;/p&gt;

&lt;p&gt;As you can see from the output, two threads are running in parallel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;@async&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Threads.@spawn&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Threads used&lt;/td&gt;
&lt;td&gt;Single thread&lt;/td&gt;
&lt;td&gt;Multiple threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallelism&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;I/O, networking&lt;/td&gt;
&lt;td&gt;CPU-heavy tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduling&lt;/td&gt;
&lt;td&gt;Cooperative&lt;/td&gt;
&lt;td&gt;Preemptive (OS threads)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>julia</category>
      <category>concurrency</category>
    </item>
    <item>
      <title>IPC - Incremental Potential Contact - implemented using Julia...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sun, 12 Apr 2026 07:39:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/ipc-incremental-potential-contact-implemented-using-julia-4l1i</link>
      <guid>https://dev.to/sommukhopadhyay/ipc-incremental-potential-contact-implemented-using-julia-4l1i</guid>
      <description>&lt;p&gt;Scientists have started noticing Julia.&lt;/p&gt;

&lt;p&gt;The word spreads.&lt;/p&gt;

&lt;p&gt;Not through a marketing campaign.&lt;/p&gt;

&lt;p&gt;But seeing the Python-like ease of code writing, along with the speed of C++.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physicists liked that Julia felt like writing equations.&lt;/li&gt;
&lt;li&gt;Engineers liked that it handled performance without boilerplate.&lt;/li&gt;
&lt;li&gt;Researchers loved that they could:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;. Prototype quickly&lt;br&gt;
. Scale to HPC when needed&lt;br&gt;
. Avoid rewriting everything in another language&lt;/p&gt;

&lt;p&gt;The two-language problem vanished.&lt;/p&gt;

&lt;p&gt;A prototype can be scaled to a production stage without much effort.&lt;/p&gt;

&lt;p&gt;I am loving it.&lt;/p&gt;

&lt;p&gt;I studied Incremental Potential Contact (IPC) some time ago and implemented it in Python. Today I used Julia to explore IPC.&lt;/p&gt;

&lt;p&gt;Here's the visualization.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/4OSvBAfmyHo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;And here's the source code...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;LinearAlgebra&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Printf&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# IPC-like Force (Barrier-inspired)&lt;/span&gt;
&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; ipc_force&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;},&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;},&lt;/span&gt;
                   &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_hat&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;eps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e-6&lt;/span&gt;
    &lt;span class="n"&gt;d_safe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;d_hat&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="c"&gt;# Barrier-like force&lt;/span&gt;
    &lt;span class="n"&gt;f_mag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;d_safe&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;d_hat&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;d_safe&lt;/span&gt;

    &lt;span class="n"&gt;f0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;f_mag&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
    &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f0&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Simulation Core&lt;/span&gt;
&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; simulate&lt;/span&gt;&lt;span class="x"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_hat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;p0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

    &lt;span class="c"&gt;# 🔥 stronger motion&lt;/span&gt;
    &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;traj0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;}}()&lt;/span&gt;
    &lt;span class="n"&gt;traj1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Vector&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;}}()&lt;/span&gt;
    &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Float64&lt;/span&gt;&lt;span class="x"&gt;[]&lt;/span&gt;

    &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;
        &lt;span class="n"&gt;f0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ipc_force&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kappa&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_hat&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mass&lt;/span&gt;
        &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;mass&lt;/span&gt;

        &lt;span class="c"&gt;# ✅ ADD DAMPING HERE&lt;/span&gt;
        &lt;span class="n"&gt;damping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.99&lt;/span&gt;
        &lt;span class="n"&gt;v0&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;
        &lt;span class="n"&gt;v1&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;damping&lt;/span&gt;

        &lt;span class="n"&gt;p0&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;
        &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;

        &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="nd"&gt;@printf&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Step %d: distance = %.6f&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p0&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;push!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Visualization (Animation + Graph)&lt;/span&gt;
&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; visualize&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0002&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ipc_simulation.gif"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;anim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;@animate&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;pos0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;pos1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;

        &lt;span class="c"&gt;# ---- LEFT: particle motion ----&lt;/span&gt;
        &lt;span class="n"&gt;p1_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scatter&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
            &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos0&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pos1&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;]],&lt;/span&gt;
            &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos0&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pos1&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;]],&lt;/span&gt;
            &lt;span class="n"&gt;xlim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ylim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Particles"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"IPC Collision Avoidance"&lt;/span&gt;
        &lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;plot!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
            &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos0&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pos1&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;]],&lt;/span&gt;
            &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pos0&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pos1&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;]],&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"distance"&lt;/span&gt;
        &lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# ---- RIGHT: distance vs time ----&lt;/span&gt;
        &lt;span class="n"&gt;p2_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Time"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Distance"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Distance vs Time"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"d(t)"&lt;/span&gt;
        &lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;hline!&lt;/span&gt;&lt;span class="x"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="x"&gt;],&lt;/span&gt; &lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=:&lt;/span&gt;&lt;span class="n"&gt;dash&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"d_hat"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# ---- Combine both ----&lt;/span&gt;
        &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1_plot&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2_plot&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;gif&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anim&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Main&lt;/span&gt;
&lt;span class="c"&gt;# -------------------------------&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; main&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Running IPC simulation with diagnostics..."&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;simulate&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Generating animation with distance plot..."&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;visualize&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traj0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traj1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Done. Check ipc_simulation.gif"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# Run&lt;/span&gt;
&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's my earlier investigation of IPC (using Python)...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwamt4bhsu1r3m968ib8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwamt4bhsu1r3m968ib8i.png" alt="IPC Blogspot Python" width="800" height="450"&gt;&lt;/a&gt;(&lt;a href="https://som-itsolutions.blogspot.com/2025/10/incremental-potential-contact-ipc.html" rel="noopener noreferrer"&gt;https://som-itsolutions.blogspot.com/2025/10/incremental-potential-contact-ipc.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Happy code digging...&lt;/p&gt;

</description>
      <category>julia</category>
      <category>ipc</category>
    </item>
    <item>
      <title>Half Sync - Half Async design pattern implemented using Julia...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Wed, 08 Apr 2026 14:11:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/half-sync-half-async-design-pattern-implemented-using-julia-1cp8</link>
      <guid>https://dev.to/sommukhopadhyay/half-sync-half-async-design-pattern-implemented-using-julia-1cp8</guid>
      <description>&lt;p&gt;&lt;strong&gt;My deep study of the Android AsyncTask framework many years ago - a perfect example of this design pattern by bright Google engineers...&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oul144dabpnrfjl8ykz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oul144dabpnrfjl8ykz.png" alt="Half Sync - Half Async" width="800" height="450"&gt;&lt;/a&gt;&lt;a href="https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing" rel="noopener noreferrer"&gt;Half Sync - Half Async&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0j100v6tzif6ks9w2mi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0j100v6tzif6ks9w2mi.webp" alt="Half Sync - Half Async Pattern" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="c"&gt;# The Julia Code&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="nc"&gt; Task&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Float64&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; worker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;
        &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Worker &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;id processing Task &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(task.id)"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;.*&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Worker &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;id finished Task &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;(task.id)"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Worker &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;id shutting down"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; async_producer&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
        &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Producing Task &lt;/span&gt;&lt;span class="si"&gt;$&lt;/span&gt;&lt;span class="s"&gt;i"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="x"&gt;()))&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; run_system&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Task&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="c"&gt;# Producer runs as async task tracked by @sync&lt;/span&gt;
        &lt;span class="nd"&gt;@async&lt;/span&gt; &lt;span class="n"&gt;async_producer&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_tasks&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# Workers&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;num_workers&lt;/span&gt;
            &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;run_system&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nthreads&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. The Pattern Refresher
&lt;/h2&gt;

&lt;p&gt;Half-Sync/Half-Async splits a system into:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Async Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Non-blocking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Event-driven&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Produces work&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Sync Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Blocking / CPU-bound&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deterministic execution&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processes work&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Boundary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A queue (here: &lt;code&gt;Channel&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decouples the two layers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  2. Mapping The Code to the Pattern
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔸 (A) Boundary → &lt;code&gt;Channel&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Channel&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Task&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the &lt;strong&gt;core of the pattern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 It acts as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;thread-safe queue&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;decoupling buffer&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;synchronization boundary&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interpretation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Async world hands off work to Sync world through a controlled interface.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  (B) Async Layer → &lt;code&gt;async_producer&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="nd"&gt;@async&lt;/span&gt; &lt;span class="n"&gt;async_producer&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_tasks&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="x"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;put!&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="x"&gt;()))&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this is “Async”:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;@async&lt;/code&gt; → cooperative scheduling (non-blocking)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sleep(rand())&lt;/code&gt; → simulates unpredictable external events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;put!&lt;/code&gt; → hands off work without doing computation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conceptual role:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“I don’t process. I just &lt;strong&gt;observe and emit events&lt;/strong&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  (C) Sync Layer → &lt;code&gt;worker&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;.*&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this is “Sync”:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;take!&lt;/code&gt; (via &lt;code&gt;for task in ch&lt;/code&gt;) → &lt;strong&gt;blocking&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU-heavy computation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Runs on real OS threads&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conceptual role:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Give me work. I will process it &lt;strong&gt;fully and deterministically&lt;/strong&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  (D) Coordination → &lt;code&gt;@sync&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="nd"&gt;@async&lt;/span&gt; &lt;span class="n"&gt;async_producer&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not part of the original pattern per se, but in Julia it ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The system behaves like a &lt;strong&gt;long-running service&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Main thread waits for both layers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  3. End-to-End Flow (Pattern in Action)
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Step-by-step:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Async Layer wakes up&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task is enqueued&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sync Layer pulls work&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processing happens&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Repeat until channel closes&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  4. Why This is Half-Sync/Half-Async (Not Just Threads)
&lt;/h1&gt;

&lt;p&gt;Because of &lt;strong&gt;strict separation of concerns&lt;/strong&gt; :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Where handled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event timing&lt;/td&gt;
&lt;td&gt;Async layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work queueing&lt;/td&gt;
&lt;td&gt;Channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;Sync layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 The producer &lt;strong&gt;never processes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 The worker &lt;strong&gt;never generates events&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That separation is the &lt;strong&gt;essence of the pattern&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Key Properties The Code Achieves
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Decoupling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Producer speed ≠ Worker speed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Buffered via &lt;code&gt;Channel(32)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backpressure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If workers are slow → channel fills → &lt;code&gt;put!&lt;/code&gt; blocks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Natural flow control&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scalability
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Increase workers → parallelism increases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Clean Shutdown
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Workers exit automatically via:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  6. Subtle but Deep Insight
&lt;/h1&gt;

&lt;p&gt;The system is &lt;strong&gt;not just parallel&lt;/strong&gt; — it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A streaming system with a controlled execution boundary&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is exactly how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;High-performance servers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simulation engines&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data pipelines&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are designed internally.&lt;/p&gt;

</description>
      <category>julia</category>
      <category>concurrency</category>
      <category>halfsynchalfasync</category>
    </item>
    <item>
      <title>Structured Concurrency in Julia: A Clean Approach Using @sync and Threads.@spawn</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Wed, 08 Apr 2026 06:19:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/structured-concurrency-in-julia-a-clean-approach-using-sync-and-threadsspawn-9ik</link>
      <guid>https://dev.to/sommukhopadhyay/structured-concurrency-in-julia-a-clean-approach-using-sync-and-threadsspawn-9ik</guid>
      <description>&lt;p&gt;Concurrency is often introduced with complexity—locks, counters, race conditions, and subtle bugs. But Julia offers a refreshing alternative: &lt;strong&gt;structured concurrency&lt;/strong&gt; , where parallel execution is expressed clearly and safely.&lt;/p&gt;

&lt;p&gt;Let’s explore this concept through a simple, elegant example.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;We simulate three students—Ridit, Ishan, and Manav—each working on a task that takes a different amount of time.&lt;/p&gt;

&lt;p&gt;Instead of executing these tasks sequentially, we want them to run &lt;strong&gt;in parallel&lt;/strong&gt; , and then proceed only when all are complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Real&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" is starting the task"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" has finished the task"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="c"&gt;# Run with: julia --threads=4   (or any number &amp;gt; 1)&lt;/span&gt;
    &lt;span class="n"&gt;ridit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ridit"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ishan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ishan"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;15.0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;manav&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Manav"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ridit took "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ridit&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="s"&gt;" seconds"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ishan took "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ishan&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="s"&gt;" seconds"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Manav took "&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manav&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="s"&gt;" seconds"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Now as all of the students have finished the task, the invigilator will leave"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Breaking It Down
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Task Definition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Real&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Announces when it starts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sleeps for a given duration (simulating work)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Announces completion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Returns the time taken&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a stand-in for any real workload—simulation steps, I/O operations, or compute-heavy routines.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Parallel Execution with &lt;code&gt;Threads.@spawn&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;ridit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Threads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@spawn&lt;/span&gt; &lt;span class="n"&gt;student_task&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ridit"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Threads.@spawn&lt;/code&gt; launches a task asynchronously&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Julia schedules it across available CPU threads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Returns a &lt;code&gt;Task&lt;/code&gt; handle immediately&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three students start working &lt;strong&gt;concurrently&lt;/strong&gt; , not one after another.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Synchronization with &lt;code&gt;@sync&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="nd"&gt;@sync&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the centerpiece.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;@sync&lt;/code&gt; waits for &lt;strong&gt;all spawned tasks inside its block&lt;/strong&gt; to complete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It automatically tracks these tasks—no manual counting required&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;structured concurrency&lt;/strong&gt; in action:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The lifetime of tasks is tied to the scope in which they are created.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Fetching Results Safely
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ridit&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Retrieves the result of the task&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the task is not finished, it &lt;strong&gt;blocks until completion&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though tasks run in parallel, &lt;code&gt;fetch&lt;/code&gt; ensures correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execution Behavior
&lt;/h2&gt;

&lt;p&gt;The tasks take:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ridit → 10 seconds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ishan → 15 seconds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manav → 20 seconds&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because they run concurrently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total runtime ≈ &lt;strong&gt;20 seconds&lt;/strong&gt; , not 45 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the key benefit: &lt;strong&gt;time compression via parallelism&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Concurrency vs Traditional Approaches
&lt;/h2&gt;

&lt;p&gt;In many languages, you would need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Counters (like latches)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explicit joins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manual bookkeeping&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, Julia abstracts that away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traditional thinking:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Track how many tasks are left.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Julia thinking:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Everything started here must finish before leaving.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This shift reduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bugs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cognitive load&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Boilerplate code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;This small example captures a powerful idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Concurrency should be structured, not improvised.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With &lt;code&gt;@sync&lt;/code&gt; and &lt;code&gt;Threads.@spawn&lt;/code&gt;, Julia gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clarity of intent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Safety by design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance with simplicity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>concurrentprogramming</category>
      <category>julia</category>
    </item>
    <item>
      <title>The suits vs engineers problem - the lesson...</title>
      <dc:creator>Somenath Mukhopadhyay</dc:creator>
      <pubDate>Sun, 22 Mar 2026 08:52:00 +0000</pubDate>
      <link>https://dev.to/sommukhopadhyay/the-suits-vs-engineers-problem-the-lesson-3k9l</link>
      <guid>https://dev.to/sommukhopadhyay/the-suits-vs-engineers-problem-the-lesson-3k9l</guid>
      <description>&lt;p&gt;IBM built Deep Blue, a specialized chess supercomputer.&lt;/p&gt;

&lt;p&gt;In the historic Kasparov vs Deep Blue 1997, Deep Blue won the match 3.5–2.5.&lt;/p&gt;

&lt;p&gt;It was the first time a reigning world champion lost to a computer under standard tournament conditions.&lt;/p&gt;

&lt;p&gt;But interestingly, Deep Blue was not “AI” in the modern sense.&lt;/p&gt;

&lt;p&gt;It mainly relied on:&lt;/p&gt;

&lt;p&gt;Massive brute-force search (millions of chess positions per second)&lt;/p&gt;

&lt;p&gt;Expert-crafted evaluation functions&lt;/p&gt;

&lt;p&gt;Special hardware chips for chess calculations&lt;/p&gt;

&lt;p&gt;Now let's come back to the point.&lt;/p&gt;

&lt;p&gt;During the early decades, IBM was extremely engineering-driven. Its research labs produced major breakthroughs:&lt;/p&gt;

&lt;p&gt;IBM System/360 — one of the most influential computer platforms ever built&lt;/p&gt;

&lt;p&gt;Hard-disk storage technology&lt;/p&gt;

&lt;p&gt;RISC processor research&lt;/p&gt;

&lt;p&gt;The chess supercomputer IBM Deep Blue&lt;/p&gt;

&lt;p&gt;But in the late 1980s–1990s, IBM faced huge competition from cheaper personal computers and software companies.&lt;/p&gt;

&lt;p&gt;Then...&lt;/p&gt;

&lt;p&gt;Bureaucracy increased&lt;/p&gt;

&lt;p&gt;Decision-making shifted toward business managers&lt;/p&gt;

&lt;p&gt;Risk-taking in engineering declined&lt;/p&gt;

&lt;p&gt;The moment suits started dominating engineering, it's all over for IBM.&lt;/p&gt;

&lt;p&gt;Always remember great technology companies are built by engineers but often slowly taken over by managers.&lt;/p&gt;

&lt;p&gt;The healthiest companies try to keep technical leadership at the top.&lt;/p&gt;

&lt;p&gt;Think about Elon Musk and his companies.&lt;/p&gt;

&lt;p&gt;Think about NVIDIA.&lt;/p&gt;

&lt;p&gt;Think about modern AI based giants.&lt;/p&gt;

&lt;p&gt;These are all engineer driven.&lt;/p&gt;

&lt;p&gt;Will sometimes in the future, they all will travel the same path as IBM?&lt;/p&gt;

&lt;p&gt;Let's keep our fingers crossed...&lt;/p&gt;

&lt;p&gt;Only time will be able to answer this...&lt;/p&gt;

</description>
      <category>engineering</category>
    </item>
  </channel>
</rss>
