\

해병 코딩

728x90
반응형

2021.03.29 - [JAVA/JAVA(자바)설치 및 툴 이용(ECLIPSE)] - [JAVA] 자바 설치 및 환경 하기 JDK 1.8 버전

 

[JAVA] 자바 설치 및 환경 하기 JDK 1.8 버전

www.oracle.com/kr/java/technologies/javase/javase-jdk8-downloads.html 위 링크 클릭 하면 여기로 온다 각자의 환경에 맞게 설치 하자 나는 윈도우 64 비트 그전 오라클 로그인 필수 1. 다운로든 된거를 실행..

marine1188.tistory.com

개발 환경

Window 10 

JDK 1.8

이클립스 2020_03 버전


 

형식>

pupublic synchronized void deposit(int amount, String name){

        임계영역.............

}

 

pupublic void deposit(int amount, String name){

       synchronized(this){

       임계영역.............

       }

}

 

synchronized 선언 방법 

1.함수에 선언

	public synchronized  void deposit(int amount, String name) {
		money += amount;
		System.out.println(name + " :  입금 금액 " + amount );
	}

2.함수 안에 넣기

	public void withdraw(int amount, String name) {
		synchronized (this) {
			//인출 할 금액이 money 보다 커야한다 그러지 않으며 출금 못함
			if ( (money - amount ) > 0 ) {
				// 있을수 없는 사항 까지온다
				Thread.yield();//일부로 엉키게 하는 코드
				money -= amount;
				System.out.println(name + " :  출금 금액 " + amount );
			}else {
				System.out.println(name + " :  출금 못함(잔액 부족~~~)" );
			}
		}
	}

 

 

 

일부로 엉끼는 코드 // 잔액이 맞을 수 가 없다

 

package ex03.Synchronized;
// atm 통장 클래스 만듬
class Atm {
	//입금되면 돈이 달라진다
	private int money;
	// 생성자에 돈을 입급 해야함 
	public Atm(int money) {
		this.money = money;
	}
	
	//입금함수
	public void deposit(int amount, String name) {
		money += amount;
		System.out.println(name + " :  입금 금액 " + amount );
	}
	//출금함수
	public void withdraw(int amount, String name) {
		//인출 할 금액이 money 보다 커야한다 그러지 않으며 출금 못함
		if ( (money - amount ) > 0 ) {
			money -= amount;
			System.out.println(name + " :  출금 금액 " + amount );
		}else {
			System.out.println(name + " :  출금 못함(잔액 부족~~~)" );
		}
	}
	// 통장 잔고 함수
	public void getMoney() {
		System.out.println("         잔액은 : " + money );
	}	
} // Atm end

class UserAtm extends Thread {
	Atm obj;
	boolean flag = false;
	
	public UserAtm(Atm obj, String name) {
		super(name);
		this.obj = obj;		
	}

	@Override
	public void run() {
		// 두바퀴를 돌린다.
		for (int i = 0; i < 2; i++) {
			try {
				sleep(50);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 한번은 입금 한번은 출금
			if( flag ) {
				//램덤한 숫자에 곱하기 10 ) +2를 한 이유 0을 피하기 위해서
				obj.deposit( (int)(Math.random() * 10 + 2 )*100,  getName() );
				obj.getMoney();
			} else {
				obj.withdraw( (int)(Math.random() * 10 + 2 )*100,  getName() );
				obj.getMoney();
			} // if end
			flag = true;
		} // for end
	}
} // UserAtm end





public class MainEntry {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Atm at = new Atm(1000);
			/*
			 금융 거래에서는 동기화가 되어 있어야한다
			 */
			UserAtm user1 = new UserAtm(at,"빈센조");
			UserAtm user2 = new UserAtm(at,"빈센왕");
			UserAtm user3 = new UserAtm(at,"빈센박");
			
			user1.start();
			user2.start();
			user3.start();			
	}

}








 

싱그로라이징 적용 코드 // 이제 어떤 한 상황에서도 딱 맞다

// 코드에서 1000이 있다고 선언 했다

//

package ex03.Synchronized;
// atm 통장 클래스 만듬
class Atm {
	//입금되면 돈이 달라진다
	private int money;
	// 생성자에 돈을 입급 해야함 
	public Atm(int money) {
		this.money = money;
	}
	
	//입금함수
	public synchronized  void deposit(int amount, String name) {
		money += amount;
		System.out.println(name + " :  입금 금액 " + amount );
	}
	//출금함수
	public void withdraw(int amount, String name) {
		synchronized (this) {
			//인출 할 금액이 money 보다 커야한다 그러지 않으며 출금 못함
			if ( (money - amount ) > 0 ) {
				// 있을수 없는 사항 까지온다
				Thread.yield();//일부로 엉키게 하는 코드
				money -= amount;
				System.out.println(name + " :  출금 금액 " + amount );
			}else {
				System.out.println(name + " :  출금 못함(잔액 부족~~~)" );
			}
		}
	}
	// 통장 잔고 함수
	public void getMoney() {
		System.out.println("         잔액은 : " + money );
	}	
} // Atm end

class UserAtm extends Thread {
	Atm obj;
	boolean flag = false;
	
	public UserAtm(Atm obj, String name) {
		super(name);
		this.obj = obj;		
	}

	@Override
	public void run() {
		// 두바퀴를 돌린다.
		for (int i = 0; i < 2; i++) {
			try {
				sleep(50);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 한번은 입금 한번은 출금
			if( flag ) {
				//램덤한 숫자에 곱하기 10 ) +2를 한 이유 0을 피하기 위해서
				obj.deposit( (int)(Math.random() * 10 + 2 )*100,  getName() );
				obj.getMoney();
			} else {
				obj.withdraw( (int)(Math.random() * 10 + 2 )*100,  getName() );
				obj.getMoney();
			} // if end
			flag = true;
		} // for end
	}
} // UserAtm end





public class MainEntry {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Atm at = new Atm(1000);
			/*
			 금융 거래에서는 동기화가 되어 있어야한다
			 */
			UserAtm user1 = new UserAtm(at,"빈센조");
			UserAtm user2 = new UserAtm(at,"빈센왕");
			UserAtm user3 = new UserAtm(at,"빈센박");
			
			user1.start();
			user2.start();
			user3.start();			
	}

}


 

빈센왕 :  출금 금액 200
         잔액은 : 800
빈센박 :  출금 금액 700
빈센조 :  출금 못함(잔액 부족~~~)
         잔액은 : 100
         잔액은 : 100
빈센박 :  입금 금액 300
빈센조 :  입금 금액 300
         잔액은 : 700
         잔액은 : 700
빈센왕 :  입금 금액 1000
         잔액은 : 1700

d

 

728x90
반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band