2020년 9월 29일 화요일

자바 멀티스레드 동기화(wait, notify, synchronized)이론.실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

  

자바 멀티스레드 동기화(wait, notify, synchronized)이론.실습(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)     

 

1. 스레드 동기화 방법 

 

wait

Object 클래스의 메소드로 이 메소드를 호출하는 스레드는 그 실행이 멈추게 된다. 하지만 아무 스레드나 실행이 멈추는 것은 아니며 호출하는 객체의 모니터를 가지고 있는 경우에만(synchronized 구문 안에 들어와 있는 경우) 해당이 된다. 즉 객체의 모니터를 가지고 있는 스레드가 wait 메소드를 호출하면 실행이 멈춘다는 뜻이다. 멈춘스레드는 그 객체의 모니터를 반환하고 대기한다.

이렇게 멈춘 스레드를 깨우려면 notify() 메소드를 호출하든지 wait() 메소드에 기다릴 시간에 대한 인자를 주어야 한다. 물론 notify로 깨우려면 객체에 대한 모니터가 필요하다.(synchronized 구문 안에 들어와 있는 경우) 

notify를 호출한 스레드가 모니터를 반환 할 때까지 (synchronized를 벗어날때 까지) 실제 깨어 있는 것이 아니다. notify를 호출한 스레드가 모니터를 반환하면 그제서야 wait되었던 스레드가 깨어난다.

 

notify

대기하는 스레드가 여럿 인경우 notify를 하면 어느 스레드가 깨어날지는 모른다. 그저 하나가 선택될 뿐이다. 이경우 전부 깨우기 위해서는 notifyAll 을 이용한다.

이 객체에 wait()하고 있는 쓰레드 중 한 쓰레드를 선택하여 재시작 한다.

다시 Monitor(lock)을 획득하지 못하면 기다린다

 

notifyAll

이 객체에 wait()하고 있는 모든 스레드 재시작

이 중 한 개만이 Monitor(lock)을 획득하고 재시작

wait(long timeout)

Timeout까지 대기한다.즉 시간이 자나면 notify() 효과를 갖는다

주의점

condition을 검사하는 loop를 만들어야

synchronized void someMethod() {

   ...

   while( !condition ) {

        wait()

 

wait와 notify의 용도

한 스레드가 어떤 객체의 메소드를 호출 할때 어떤 조건을 만족해야 한다면 이 스레드는 자신이 아직 이 메소드를 실행 할 준비가 되지 않았으므로 스스로 조건이 될 때까지 기다려야 한다. 이때 객체의 모니터를 얻고 wait를 호출함으로서 조건을 기다리게 된다. 이때 다른 스레드가 조건이 만족되었음을 알고 notify를 호출하여 스레드는 깨어나서 만족된 조건하에서 남은 작업을 진행하게 되는 것이다.

 

 

2. 실습

 

5c6380ca3f51e7e725b6f7ffa99b9509_1601389
 

 

package javatest;

 

class SharedData {

    private boolean isFullData = false;

    private int data;

    

    // 어느 한순간에는 하나의 스레드만 put

    // 데이터가 차있으면 wait한다.

    public synchronized void put(int data)     {

        try {

            while(isFullData)   // 데이터가 있으면 대기

                wait();      

        } catch(InterruptedException e ) {}

        this.data = data;        //데이터가 없으면 데이터를 채움

        isFullData = true;       //데이터 차있다고 표시

        notifyAll();             // 대기하는 모든 스레드 깨움

 

    }

    

    // 어느 한순간에는 하나의 스레드만 get

    // 데이터가 없으면 wait 한다.

    public synchronized int get()     {

        try {

            while( !isFullData)   // 데이터가 없으면 대기

                wait();           

        } catch(InterruptedException e ) {}

        isFullData = false;       //데이터 없다고 표시

        notifyAll();          // 대기하는 모든 스레드 깨움

        return data;          //    데이터를 꺼냄

    }

}

 

class Writer extends Thread {

    private SharedData shared;

    private int data;

    public Writer(String name, SharedData shared, int data) {

     super.setName(name);

        this.shared = shared;

        this.data = data;

    }

    public void run() {

        shared.put(data); //System.out.println( getName() + " put " + data);

        shared.put(data+1); //System.out.println( getName() + " put " + (data+1));

    }

}

class Reader extends Thread {

    SharedData shared;

    public Reader(String name, SharedData shared) {

     super.setName(name);

        this.shared = shared;

    }

    public void run() {

        while(true) 

            System.out.println( getName() + " got " + shared.get() );

    }

}

 

class WaitTest 

{

    public static void main(String[] args) 

    {

        SharedData shared = new SharedData();

        Reader r1 = new Reader("READER-1", shared);

        Reader r2 = new Reader("READER-2", shared);

        Writer w1 = new Writer("WRITER-1", shared, 10);

        Writer w2 = new Writer("WRITER-2", shared, 20);

 

        r1.start();

        r2.start();

        w1.start();

        w2.start();

    }

}

 

#자바스레드#자바쓰레드#자바Thread#자바volatile, #자바Atomic, #자바wait, #자바notify, #자바synchronized, #스레드동기화, #스레드#volatile#자바#JAVA#자바동영상#자바강의#자바교육#자바강좌#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바온라인교육#자바온라인강의    

2020년 9월 28일 월요일

자바 멀티스레드 메소드, 블록동기화(synchronized), volatile, Atomic쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

 

자바 멀티스레드 메소드, 블록동기화(synchronized), volatile, Atomic쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)


https://youtu.be/cIMooxte59E



http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=770

이미지 썸네일 삭제

자바 멀티스레드 메소드, 블록동기화(synchronized), volatile, Atomic쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

자바 멀티스레드 메소드, 블록동기화(synchronized), volatile, Atomic쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)1. 쓰레드 동기화(synchronization)멀티스레드 환경에서 여러 스레드가 동일한 리소스에 접근하려고 하는 경우 동시성 문제로 인해 예기치 않은 결…

ojc.asia

1. 쓰레드 동기화(synchronization)


멀티스레드 환경에서 여러 스레드가 동일한 리소스에 접근하려고 하는 경우 동시성 문제로 인해 예기치 않은 결과를 생성 할 수 있습니다.

만약 여러 스레드가 동일한 파일을 읽어 쓰려고 하면 여러 스레드가 같은 파일을 동시에 여는 동안 어떤 스레드가 파일을 닫을 수 있기 때문에 데이터가 손상 될 수 있습니다.

따라서 여러 스레드의 작업을 동기화하고 주어진 시점에서 하나의 스레드 만 리소스에 액세스 할 수 있는지 할 수있어야 합니다.

이것은 모니터(Monitor)라는 개념을 사용하여 구현되는데 Java의 각 개체는 스레드가 잠 그거나 잠금 해제 할 수 있는 모니터(Monitor)와 연결됩니다. 한 번에 하나의 스레드 만 모니터에 잠금을 유지할 수 있습니다.

자바 프로그래밍 언어는 synchronized를 사용하여 스레드를 생성하고 작업을 동기화하는 방법을 제공하고 이 블록 내에 공유 리소스를 유지합니다.



2. Synchronized 키워드

synchronized (객체참조변수) { ... 문장 }

객체참조변수가 가리키는 객체에 대하여 lock

문장을 실행

객체참조변수가 가리키는 객체에 대하여 unlock

synchronized 인스턴스 메소드

this 객체에 lock

synchronized 클래스 메쏘드

클래스 자료형을 나타내는 Class 객체에 lock



3. 공유 데이타 이상 접근

200000이 출력되지 않고 가지각색으로 값이 출력됨



class Counter {

//volatile은 값을 원본(메인 메모리)에서 읽으라는 뜻으로 값을 일고 쓰는것에

//대한 동기화이지 increment 메소드와 같은 행위의 동기화는 아니다.

volatile public int count = 0;


public void increment() {

++count;

}

}


public class CounterTest extends Thread {

Counter counter;

public CounterTest(Counter counter) {this.counter = counter;}


public void run() {

for (int i = 0; i < 100000; ++i)

counter.increment();

}



public static void main(String[] args) throws Exception {

Counter counter = new Counter();

CounterTest thread1 = new CounterTest(counter);

CounterTest thread2 = new CounterTest(counter);


thread1.start();thread2.start();

thread1.join(); thread2.join();

System.out.println(counter.count); //200,000이 출력되지 않음

}

}


4. synchronized 키워드 이용


200000 출력됨


class Counter {

volatile public int count = 0;

public void increment() { //public synchronized void increment()

synchronized (this) {

++count;

}

}

}


……

이하 동일



5. Automic 클래스 이용


class Counter

{

static AtomicInteger count = new AtomicInteger(0);


public void increment()

{

count.getAndAdd(1);

}

}

……

이하 동일



#자바스레드,#자바쓰레드,#자바Thread,#자바volatile, #자바Atomic, #자바synchronized, #스레드동기화,#스레드,#volatile,#자바,#JAVA,#자바동영상,#자바강의,#자바교육,#자바강좌,#자바동영상강의,#추천자바강의,#추천자바강좌,#JAVA동영상,#JAVA강의,#JAVA강좌,#JAVA교육,#JAVA,#추천JAVA강의,#추천JAVA교육,#추천JAVA강좌,#자바소스,#자바온라인교육,#자바온라인강의



자바 멀티스레드 변수값 동기화(volatile, Atomic, Multi-Thread), 쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)

 

http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=769


자바 멀티스레드 변수값 동기화(volatile, Atomic, Multi-Thread), 쓰레드예제 (자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)   

 

1. Volatile

 

변수를 CPU 캐시가 아닌 Main Memory에 저장 하겠다라는 것을 명시하는 것인데 매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것이다. 또한 변수의 값을 Write할 때도 Main Memory에 쓰는 것이다.

volatile은 컴파일러에게 이 데이터( 변수, 메소드)에 대해 멀티스레드로 접근하고 있음을 알려주는 것인데  읽기,쓰기에 대해서 동기화를 보장한다.

synchronized는 행위에 대한 동기화이며 volatile은 행위의 타겟에 대한 동기화 이다.

하나의 변수를 여러 스레드에서 사용할 때 사용하는 키워드이다. 멀티 스레드가 어떤 변수에 접근하는 경우 그 값이 예측불허하게 바뀌는 것을 막기 위한 기능이다. 

하나의 변수를 멀티 스레드에서 사용하게 되면 각 스레드마다 해당 변수 값을 저장하는 작업 복사본(CPU Cache)을 하나씩 가지고 있어서 스레드는 원본 값을 접근하기 위해 자신의 작업 복사본에 값을 저장하고 어떠한 연산을 거친 뒤 다시 원본 값을 쓰는 방식을 취하는데 이러한 경우 동기화에 문제가 있다. 만약 화면에 변수 값을 찍는 작업을 위해 하나의 스레드가 자신의 작업 복사본에 값을 읽어 들이고 그 값을 찍기 이전에 다른 스레드가 그것을 변경했다고 한다면 한 쪽 스레드는 변경되기 이전의 값이 존재하고 다른 한 쪽은 변경된 값을 가지게 된다.

 

이것을 막기 위해 volatile을 사용하면 스레드가 특정 변수를 접근하려는 연산이 발생하면 무조건 다시 원본의 값을 가져오게 하는 것이다.

volatile은 하나의 Thread가 write하고 나머지 Thread가 읽는 상황인 경우, 변수의 값이 최신의 값으로 읽어와야 하는 경우 등에 사용하면 되지만 성능에 영향을 주는 부분은 고려해야 한다.

 

2. Volatile, Atomic

 

volatile은 읽기 쓰기에 대한 동기화를 보장하고 연산에 대해서는 동기화를 보장하지 않으므로 변수가 Thread에 안전하려면 java.util.concurrent.atomic.Atomic* 클래스들을 사용한다.

Java SE 5 이후로, java.concurrent.Atomic.* 클래스가 따로 제공되어 원자성을 제공한다. 

예제 실습 : 아래 예제를 보면 volatile변수의 값도 동기화가 되지 않는데 이는  변수의 값을 Main Memory에서 직접 핸들링 하지만 그것에 대한 행위의 제어(lock)는 제공하지 않기 때문이다.

http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=656&page=3

 

 

#자바스레드#자바쓰레드#자바Thread#자바volatile, #자바Atomic, #스레드#volatile#자바#JAVA#자바동영상#자바강의#자바교육#자바강좌#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바온라인교육#자바온라인강의  

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...