Core Java

Lombok @Locked Annotation Example

Lombok is a popular Java library that helps reduce boilerplate code by automatically generating getters, setters, constructors, and more. One of its lesser-known but powerful features is the @Locked annotation, which simplifies locking in concurrent programming. Let us delve into understanding the Java Lombok Locked annotation and its applications.

1. Introduction

Lombok is an annotation-based library designed to make Java development easier and cleaner. It does this by reducing repetitive code. Lombok provides many annotations, like @Getter, @Setter, @Builder, and more, to minimize boilerplate code. The @Locked annotation, however, specifically addresses thread safety and synchronization, making it easier to manage access to shared resources in a multithreaded environment.

1.1 Why @Locked Annotation?

Managing access to shared resources in a concurrent environment is crucial to prevent data inconsistencies and ensure thread safety. Traditional synchronization methods, such as using the synchronized keyword, can lead to verbose code. The @Locked annotation provides a more readable way to apply locks to specific methods or blocks of code, improving code readability while still ensuring thread safety.

1.2 Understanding @Locked Annotation

The @Locked annotation is used to specify that a particular resource should be locked when accessing the annotated method. This lock helps prevent concurrent access to a shared resource, ensuring that only one thread can execute the annotated method at a time. This is similar to using the synchronized keyword but offers more flexibility by allowing you to define custom locks.

1.3 Useage of @Locked Annotation

  • Improves readability by replacing traditional synchronization with an annotation.
  • Offers greater control over which lock object is used, allowing custom locking strategies.
  • Reduces boilerplate code, making it easier to manage concurrency in Java applications.

1.4 Adding Lombok Dependency

To use the @Locked annotation in Lombok, you need to add the Lombok dependency to your project. To add Lombok to your project using Maven, include the following dependency in your pom.xml file:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>your_latest_version</version>
</dependency>

If you’re using Gradle, add this dependency to your build.gradle file:

implementation 'org.projectlombok:lombok:1.18.30'

2. Code Example

Here is an example of how to use the @Locked annotation in Lombok:

// Import necessary classes

import lombok.extern.slf4j.Slf4j;
import lombok.experimental.Locked;

@Slf4j
public class Counter {

  private int count = 0;

  // Define a lock object
  private final Object lock = new Object();

  @Locked("lock") // Locks on the 'lock' object
  public void increment() {
    count++;
    log.info("Count after increment: " + count);
  }

  public int getCount() {
    return count;
  }

  public static void main(String[] args) {
    Counter counter = new Counter();

    // Creating threads that call increment
    Thread t1 = new Thread(counter::increment);
    Thread t2 = new Thread(counter::increment);

    t1.start();
    t2.start();
  }
}

In this example, the increment() method is annotated with @Locked("lock"). The annotation tells Lombok to acquire the lock on the lock object before executing the method. When increment() is called by multiple threads, only one thread will be able to increment the count at a time, ensuring thread safety.

Count after increment: 1
Count after increment: 2

As shown in the output, each thread increments the count without causing a race condition due to the lock.

3. Difference Between @Locked and @Synchronized

Aspect@Locked@Synchronized
CustomizationAllows locking on any object, specified as a parameter.Always locks on the object’s intrinsic lock (this).
ReadabilityImproves readability with concise syntax.Standard Java synchronization but can be more verbose.
ControlGives more control over which lock object to use.Limited to intrinsic lock, with no control over the lock object.
FlexibilitySupports locking on any specified lock object, making it flexible for complex locking mechanisms.Limited to intrinsic locking, which may not suit complex locking requirements.
PerformancePotentially more efficient by allowing fine-grained control over locking.May introduce overhead if used excessively, as it locks on the intrinsic lock.
Error-Prone UsageRequires careful selection of lock objects to avoid deadlocks.Less error-prone as it locks on a single intrinsic lock, but still requires cautious use to avoid deadlocks.
DependencyDepends on Lombok, so requires the Lombok library to be included in the project.Native to Java, so no additional dependencies are needed.
Usage ScopePrimarily intended for Lombok users and more specialized locking needs.Widely used in standard Java for basic synchronization needs.

4. Conclusion

The @Locked annotation in Lombok is a powerful tool for managing thread safety in a cleaner, more flexible way. By allowing custom lock objects and improving readability, it offers a streamlined alternative to traditional synchronization mechanisms. For developers looking to simplify concurrency in their code, @Locked can be a valuable addition.

Using @Locked is beneficial when you need granular control over your locking mechanism, enhancing both code maintainability and performance.

Yatin Batra

An experience full-stack engineer well versed with Core Java, Spring/Springboot, MVC, Security, AOP, Frontend (Angular & React), and cloud technologies (such as AWS, GCP, Jenkins, Docker, K8).
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button