본문 바로가기

synchronized

[Java Design Patten] Thread Specific Storage 패턴 Thread를 사용하다보면 Local 변수는 상관없지만 다른 용도로 데이터의 저장이 필요할 때 Memeber변수를 사용하는 건 문제가 많을 수 있다. 그럴 때 사용하기 좋은 패턴이다. 여기서 핵심은 Log Class 이고 ThreadLocal을 사용한다는 점을 주목하자~! public class TSLog {private PrintWriter writer = null;public TSLog (final String filename) {try {writer = new PrintWriter (new FileWriter(filename));} catch (final IOException e) {e.printStackTrace();}}public void println(final String s) {writer.. 더보기
[Java Design Patten] Two-Phase Termination 패턴 쓰레드가 일반적인 처리를 실행하고 있는 상태를 [작업중]이라고 부르고 이 쓰레드를 중단하고 싶은 때는 [종료 요구]를 합니다. 그리고 종료에 필요한 뒷정리를 시작할 때 [종료 처리 중] 이고 여기서 끝나면 진짜로 쓰레드가 종료합니다. 종료하는 역할 public class CountupThread extends Thread {private long counter = 0;private volatile boolean shutdownRequested = false;public void shutdownRequest() {shutdownRequested = true;interrupt();}public boolean isShutdownRequested () {return shutdownRequested;}public.. 더보기
[Java Design Patten] Future 패턴 케이크를 사러 빵집에 갔습니다. 주문을 하자 주인이 저녁에 찾으러 와주세요 하면서 교환권을 줍니다. 저녁이 되어서 교환권을 들고 케이크를 가지러 갔습니다. 주인은 케이크를 건네 주었습니다. Futrue 패턴은 위의 줄거리와 유사하다. 우선은 Main을 보자 host를 통해 Data를 받는다. 그리고 다른 작업(여기서는 쉬는 2초간 대기)을 하다가 데이터를 사용한다. Data를 교환권이라고 보면 되다. public static void main (String[] agrs) {System.out.println("main BEGIN");final Host host = new Host();final Data data1 = host.request(10, 'A');final Data data2 = host.requ.. 더보기
[Java Design Patten] Worker Thread 패턴 Worker Thread 패턴에서는 Worker thread가 일을 하니씩 가지러 가고, 또 처리합니다. 일이 없으면 Worker thread는 새로운 일이 올때까지 대기합니다. Client 역할업무를 작성하여 Channel역할에게 일을 전 달 public class ClientThread extends Thread {private final Channel channel;private static final Random random = new Random();public ClientThread (final String name, final Channel channel) {super(name);this.channel = channel;} public void run () {try {for (int i=0;.. 더보기
[Java Design Patten] Thread per Message 패턴 이번 패턴을 간단하게 요약해서 이야기하면"어떠한 명령이나 요구마다 새로 한개의 쓰레드가 할당되고 그 쓰레드가 처리를 실행한다." 역할은 Client, Host, Helper로 나눌 수 있다. Client는 Request를 요구하는 역할이다. 여기선 Main이 담당 public class Main {public static void main (final String[] args) {final Host host = new Host();host.request(10,'A');host.request(20,'B');host.request(30,'C');} } Host는 Client로부터 Request를 받으면 새로운 Thread를 생성하는 역할 public class Host {private final Helper.. 더보기
[Java Design Patten] Read-Write Lock 패턴 여러개의 쓰레드가 동시에 읽는 것은 문제가 없습니다. 하지만 읽는 중간에 쓰게 되면 문제가 발생하기에 이런 경우에 사용하면 효과적이다. 읽기 쓰기 Lock을 담당 public final class ReadWriterLock {private int readingReaders = 0;private int waitingWriters = 0;private int writingWriters = 0;private boolean preferWriter = true;public synchronized void readLock () throws InterruptedException {while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {wait();}r.. 더보기
[Java Design Patten] Producer - Consumer 패턴 이 패턴에서는 Producer와 Consumer 그리고 Channel의 역할이 필요하다. Channel의 역할이 필요한 이유 Producer역할이 Consumer 역할의 처리 상황에 좌우되지 않게 하기 위함 Producer 역할 public class MakerThread extends Thread {private final Random random;private final Table table;private static int id = 0;public MakerThread (final String name, final Table table, final long seed) {super(name);this.table = table;this.random = new Random(seed);}public voi.. 더보기
[Java Design Patten] Guarded Suspension 이 처리를 실행하면 안 될 때 처리하기 직전에 쓰레드를 기다리게 하는 패턴이다. 아래의 시퀀스 다이어그램을 참고~! public class Request {private final String name;public Request (final String name) {this.name = name;}public String getName () {return this.name;} public String toString() {return "Request [name=" + name + "]";} } public class RequestQueue { private final Queue queue = new LinkedList();public synchronized Request getRequest () {whi.. 더보기
[Java] synchronized 사용법 정리 1. synchronized void method () {.....} 2. void emthod () {synchronized (this) {....}} 3. class Something {static synchronized void method () {...}} 4. class Something {static void method () {synchronized (something.class) {...}}} 더보기