Teachnique
      CourseRoadmaps
      Login

      OverviewHistoryFeaturesJava 8 - New Featuresvs C++Virtual Machine(JVM)JDK vs JRE vs JVMHello World ProgramEnvironment SetupBasic SyntaxVariable TypesData TypesType CastingUnicode SystemBasic OperatorsCommentsStreamsNew Date-Time API

      Loop ControlDecision Makingif-else Statementswitch statementfor loopfor each Loopwhile Loopdo...while Loopbreak Statementcontinue Statement

      OOPs (Object-Oriented Programming) ConceptsObject and ClassesClass AttributesClass MethodsMethodsVariable ScopesConstructorsAccess ModifiersInheritanceAggregationPolymorphismOverridingMethod OverloadingDynamic BindingStatic BindingInstance Initializer BlockAbstractionEncapsulationInterfacesPackagesInner classesStatic ClassesAnonymous ClassesSingleton ClassWrapper ClassesEnum Class

      Number ClassBoolean classCharacter ClassArraysMath Class

      File ClassCreating FilesWrite To FilesReading FileDelete FilesDirectory OperationsFiles and I/O

      ExceptionsTry Catch BlockTry with ResourcesMultiple Catch BlocksNested Try BlockFinally BlockThrows and Throw | Throw an ExceptionException PropagationBuilt-in ExceptionsCustom Exception

      MultithreadingThread Life CycleCreating a ThreadStarting a ThreadJoining ThreadsNaming a Thread with ExamplesScheduling Threads with ExamplesThread PoolsMain ThreadThread PriorityDaemon ThreadThreadGroup ClassJVM Shutdown Hook

      Thread SynchronizationBlock SynchronizationStatic SynchronizationInter Thread CommunicationThread DeadlockInterrupting ThreadThread ControlReentrant Monitor

      NetworkingSocket ProgrammingURL ProcessingURL ClassURLConnection ClassHttpURLConnection ClassSocket Class with ExamplesGenerics

      Collections FrameworkCollection Interface

      List InterfaceArrayList Class

      Queue InterfaceArrayDeque Class

      Map InterfaceSortedMap Interface

      Set InterfaceSortedSet Interface

      Data Structures Enumeration Interface BitSet Class

      How to Use Iterator?How to Use Comparator?How to Use Comparable?

      RecursionRegular ExpressionsSerializationString ClassJava Arrays - Class

      Feedback

      Submit request if you have any questions.

      Course
      Static Synchronization

      Java Tutorial

      This Java tutorial is tailored for newcomers, offering a journey from basic principles to complex Java programming techniques. Completing this tutorial equips you with a solid understanding of Java, preparing you for advanced learning. You'll emerge ready to tackle the challenges of becoming a top-tier software engineer, with the skills to innovate and excel in the vast world of software development.

      Static Synchronization

      Synchronization is a way that establishes cooperation between multiple threads trying to access shared resources. It is necessary for reliable thread interaction and is done using the 'synchronized' keyword. Here, threads are small sub processes of a big operation. In this article, we are going to learn static synchronization and how they manage threads so that they can work efficiently.

      Multithreading

      Multithreading is a feature of Java programming language that allows us to perform multiple operations simultaneously. In it, the operation gets divided into multiple smaller parts called a thread. Each thread performs one independent task without affecting the other thread’s performance. The main benefit of multithreading is the optimal use of resources like CPU and it boosts the execution time of allocated operations.

      Synchronization

      The threads are executed in an asynchronous manner therefore, it is impossible to predict how they are going to interact. Sometimes, several threads may try to access a single resource, then a problem arises because it might create a faulty result of the allocated task. At this time, Synchronization comes into the picture and ensures that a single thread can access the given resource at one time. This is possible because of the lock object that guards the synchronized region. When a thread enters that region, the lock gets assigned to it and it releases the lock after executing its task. Till the resources are busy other threads wait in a queue for their turn.

      Static Synchronization in Java

      When we use this type of synchronization then, if a thread is in the static synchronized region, all other threads trying to access this region will be blocked. Since static methods belong to the class therefore, static synchronization applies class level lock.

      Syntax of Static Synchronization

      static synchronized returnType nameOfMethod( Type parameters) {
      // code
      }
      Here returnType may be void or any primitive data type. parameters contains name of the variable followed by datatype.

      Multithreading Without Static Synchronization

      Here is a simple example which may or may not print counter value in sequence and every time we run it, it produces a different result based on CPU availability to a thread.

      Example of Multithreading Without Static Synchronization

      package com.tutorialspoint;
      
      class PrintDemo {
      public static void printCount() {
      try {
      for(int i = 5; i > 0; i--) {
      Thread.sleep(50);
      System.out.println("Counter --- " + i );
      }
      } catch (Exception e) {
      System.out.println("Thread interrupted.");
      }
      }
      }
      
      class ThreadDemo extends Thread {
      private Thread t;
      private String threadName;
      
      ThreadDemo( String name) {
      threadName = name;
      }
      public void run() {
      PrintDemo.printCount();
      System.out.println("Thread " + threadName + " exiting.");
      }
      
      public void start () {
      System.out.println("Starting " + threadName );
      if (t == null) {
      t = new Thread (this, threadName);
      t.start ();
      }
      }
      }
      
      public class TestThread {
      public static void main(String args[]) {
      ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
      ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );
      
      t1.start();
      t2.start();
      
      // wait for threads to end
      try {
      t1.join();
      t2.join();
      } catch ( Exception e) {
      System.out.println("Interrupted");
      }
      }
      }
      This produces a different result every time you run this program

      Output

      Starting Thread - 1
      Starting Thread - 2
      Counter --- 5
      Counter --- 5
      Counter --- 4
      Counter --- 4
      Counter --- 3
      Counter --- 3
      Counter --- 2
      Counter --- 2
      Counter --- 1
      Counter --- 1
      Thread Thread - 1 exiting.
      Thread Thread - 2 exiting.

      Multithreading With Static Synchronization

      Here is the same example which prints counter value in sequence and every time we run it, it produces the same result. W've put synchronized keyword over a method this time so that complete method is locked as per the object during method execution.

      Example of Multithreading With Static Synchronization

      package com.tutorialspoint;
      
      class PrintDemo {
      public static synchronized void printCount() {
      try {
      for(int i = 5; i > 0; i--) {
      Thread.sleep(50);
      System.out.println("Counter --- " + i );
      }
      } catch (Exception e) {
      System.out.println("Thread interrupted.");
      }
      }
      }
      
      class ThreadDemo extends Thread {
      private Thread t;
      private String threadName;
      
      ThreadDemo( String name) {
      threadName = name;
      }
      public void run() {
      PrintDemo.printCount();
      System.out.println("Thread " + threadName + " exiting.");
      }
      
      public void start () {
      System.out.println("Starting " + threadName );
      if (t == null) {
      t = new Thread (this, threadName);
      t.start ();
      }
      }
      }
      
      public class TestThread {
      public static void main(String args[]) {
      ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
      ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );
      
      t1.start();
      t2.start();
      
      // wait for threads to end
      try {
      t1.join();
      t2.join();
      } catch ( Exception e) {
      System.out.println("Interrupted");
      }
      }
      }
      This produces following result every time you run this program

      Output

      Starting Thread - 1
      Starting Thread - 2
      Counter --- 5
      Counter --- 4
      Counter --- 3
      Counter --- 2
      Counter --- 1
      Thread Thread - 1 exiting.
      Counter --- 5
      Counter --- 4
      Counter --- 3
      Counter --- 2
      Counter --- 1
      Thread Thread - 2 exiting.