mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-05-16 12:59:13 +00:00
feature: Rewrite thread-local storage pattern (#2452)
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
package com.iluwatar;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* Class with main logic.
|
||||
*/
|
||||
public abstract class AbstractThreadLocalExample implements Runnable {
|
||||
|
||||
private static final SecureRandom RND = new SecureRandom();
|
||||
|
||||
private static final Integer RANDOM_THREAD_PARK_START = 1_000_000_000;
|
||||
private static final Integer RANDOM_THREAD_PARK_END = 2_000_000_000;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
long nanosToPark = RND.nextInt(RANDOM_THREAD_PARK_START, RANDOM_THREAD_PARK_END);
|
||||
LockSupport.parkNanos(nanosToPark);
|
||||
|
||||
System.out.println(getThreadName() + ", before value changing: " + getter().get());
|
||||
setter().accept(RND.nextInt());
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for our value.
|
||||
*
|
||||
* @return consumer
|
||||
*/
|
||||
protected abstract Consumer<Integer> setter();
|
||||
|
||||
/**
|
||||
* Getter for our value.
|
||||
*
|
||||
* @return supplier
|
||||
*/
|
||||
protected abstract Supplier<Integer> getter();
|
||||
|
||||
private String getThreadName() {
|
||||
return Thread.currentThread().getName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.iluwatar;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
/**
|
||||
* Example of runnable with use of {@link ThreadLocal}.
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class WithThreadLocal extends AbstractThreadLocalExample {
|
||||
|
||||
private final ThreadLocal<Integer> value;
|
||||
|
||||
/**
|
||||
* Removes the current thread's value for this thread-local variable.
|
||||
*/
|
||||
public void remove() {
|
||||
this.value.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Consumer<Integer> setter() {
|
||||
return value::set;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Supplier<Integer> getter() {
|
||||
return value::get;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.iluwatar;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
/**
|
||||
* Example of runnable without usage of {@link ThreadLocal}.
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class WithoutThreadLocal extends AbstractThreadLocalExample {
|
||||
|
||||
private Integer value;
|
||||
|
||||
@Override
|
||||
protected Consumer<Integer> setter() {
|
||||
return integer -> value = integer;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Supplier<Integer> getter() {
|
||||
return () -> value;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user