반응형

Synchronized

    규칙 67 - 과도한 동기화는 피하라

    동기화 시에 너무 많은 동기화 블록을 사용할 경우에 데드락이 걸리거나 성능저하 등등 문제를 일으킬 수 있는 소지들이 몇 가지 있다. 특히 동기화 영역안에서 수행되는 작업의 양을 가능한 줄여야 한다. 자바에서는 동기화에 대한 비용처리가 그나마 잘되어있지만 잘 사용해야 하는 이유는 잘못된 동기화 사용은 각 쓰레드들의 메인 메모리 접근에 대한 지연시간을 늘릴 수 있기 때문에 비용이 증가할 수 있다. 또한 클래스 내에서 동기화를 수행하는 것이 외부에서 객체 호출 시 사용하는것 보다 높은 병행성을 달성 할 수 있을 때문 진행해야한다. 다시말하자면 필요할 때 해당 메서드등을 호출하여 동기화를 실행해야지 해당 메서드 자체를 동기화 하는것은 좋지 않다. 예를 들면 기존에는 StringBuffer를 사용하여 내부적으로 ..

    규칙 66 - 변경 가능 공유 데이터에 대한 접근은 동기화하라.

    우리는 동시에 사용이 가능한 객체에 대해서 synchronized키워드를 사용하여 락을 걸어 코드 블록을 한번에 하나의 스레드만 접근할 수 있도록 한다. 이런 동기화를 적절하게 사용하면 모든 메서드가 항상 객체의 일관된 상태만 바라보도록 할 수 있다. 하지만 동기화 없이는 한 스레드가 만든 변화를 다른 스레드가 확인할 수 없다. 동기화는 스레드가 일관성이 깨진 객체를 관측할 수 없도록 할 뿐 아니라, 동기화 메서드나 동기화 블록에 진입한 스레드가 동일한 락의 보호 아래 이루어진 변경의 영향을 관측할 수 있도록 보장한다. 그렇기 때문에 특정 객체의 값을 다른 쓰레드가 읽기를 원한다면 동기화를 무조건 진행해야한다.즉, 변경 가능한 공유 데이터에 대한 접근을 동기화 해야한다. 다음 예를 보자.123456789..

    synchronized 쓰레드 예제 프로그래밍

    문제의 프로그램package javas; import javax.swing.JOptionPane; public class Thread1 { public static void main(String args[]) { Runnable r = new RunnableEX(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); }} class Account{ int balance = 1000; public void withdraw(int money){ if(balance >= money){ try{ Thread.sleep(1000);} catch (Exception e){ } balance -= money; } }} class..

    Thread 동기화 문제

    Thread 동기화 문제스레드는 중앙의 리소스풀로 부터 빌린다. 스레드는 메모리, 파일 핸들, 소켓 등의 리소스를 공유하여 프로그램을 좀 더효율적으로 만단ㄷ. 두 스레드가 동시에 같은 리소스를 사용하지만 않는다면 멀티 스레드 프로그램이 각 프로스스가별도의 리소스를 유지하는 멀티 프로세스 프로그램보다 훨씬 효율적이다.그러나 언제 어느 문장이 실행될지 몰라 결과의 순서를 예측할 수 없고, 자원을 공유하고 있을 경우 데드락 현상이 발생할 수 있다.스레드에 동일자원 접근에 대해 배타적인 접근을 할당해 줄 방법은 Synchronized를 명시해주는 방법이다.예제)Run(){System.out.println(result);} Thread.start() 진행 시 System.out.println 자원을 서로 공유하기..

반응형