본문 바로가기

Java Programming

(51)
Multi-Threading ⑤ Synchronization & DeadLock 병행성의 문제를 해결하기 위해서는 '동기화' 라는 키워드를 사용합니다. 쉽게 말하자면, 동기화를 한 메소드에는 한 스레드 객체만이 접근할 수 있도록 자물쇠와 열쇠를 놓습니다. 한 스레드가 메소드에 접근을 하고 열쇠를 가지고 자물쇠를 잠근후에 들어갑니다. 해당 스레드가 동기화된 메소드에서 나오기 전까지는 키가 반납되지 않으므로 이후에 도착한 스레드들은 먼저 들어간 스레드가 나올때 까지 기다립니다. 이와 같은 방식을 동기화 한다고 합니다. 메소드명 앞에 Synchronized 라는 키워드를 통해서 동기화를 시켜 줄수 있습니다. 따라서 지난 예제에서 말썽을 부리게 된 increase() 라는 메소드 앞에 synchronized 키워드를 사용하면 문제를 해결할 수 있습니다. public synchronized ..
Multi-Threading ④ Concurrency Problem 앞서 말한 자바에서의 스레드의 특징중에, 잠재적인 문제 발생의 위험이 있다고 했었는데요, 첫째로 병행성의 문제에 대해서 알아보도록 하겠습니다 ^^ 병행성의 문제라는 것을 풀어서 이야기 하자면, 여러개의 스레드 객체가 한개의 리소스를 공유하기 때문에 발생하는 문제점이라는 겁니다! 일단 말로 이야기 하면 지루하기 때문에 소스코드를 보시면서 이야기 하겠습니다! public class ConcorrencyTrouble implements Runnable { private int total; public void run() { for (long i = 0; i < 10; i++) { increase(); System.out.println("total value is :" + total); } } public vo..
Multi-Threading ③ Thread Objects 일단 멀티 스레드로 작업을 하기 위해서는 Runnable 이라는 인터페이스를 구현(implements)하거나 Thread 클래스를 상속(extends)받는 두가지의 방법이 있습니다. 다시 말하면, run() 이라는 메소드가 있어야 하기 때문인데, Thread 클래스는 Runnable을 구현하고 있기 때문에 결국은 Runnable 인터페이스를 구현하는 셈이 되는거죠. /* * Runnable 인터페이스를 구현하는 경우 */ public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new..
Multi-Threading ② Features of Threads 자바에서의 스레드는 아래와 같은 특징이 있습니다. Share the process's resources Potentially problematic, communication - Concurrecy Problem - Too many synchronized - Deadlock Multithreaded execution is an essential feature of the Java platform 프로세스의 자원을 공유하고, 의사소통에서의 잠재적인 문제야기의 가능성이 있으며, 자바의 중요한 특징 중에 하나라는 점입니다. 첫째로, 프로세스의 자원을 공유한다는 말은, 프로세스 내부에 존재하는 스레드가 실행환경을 위해 모든 것을 갖추고 있는 프로세스의 자원을 사용하여 실행이 된다는 뜻이라는 것을 알 수 있습니다...
변수 초기화와 메인 메소드 이것도 도장에서 시험문제를 풀다가 나온건데요 +_+;; 변수 초기화에 관해서 문제가 나왔습니다. 메인 메소드에서 초기화 되지 않은 정수형 값에 1을 더한후에 그 숫자를 콘솔창에 띄우는 코드 였습니다. 또.. 당연히.. 초기화 되지 않은 정수형 값은 0으로 자동으로 되겠거니 했지만.. -_-;; 전혀 아닙니다. 예제를 위하여 소스코드를 한번 짜봤습니다. public class Initialization { int freeInit; String canIfree; static int staticVariable; public static void main(String[] args) { /* * Compile Error : Illegal modifier for parameter staticVariable2; on..
생성자의 재발견, super() 오늘도 보기 좋게 도장에서 시험에 낙방을 했습니다 ㅠㅠ 한문제만 더 맞았으면 합격인데.. -_-;; 아직도 많이 부족한것 같습니다. 낙방을 하게 된 원인들(오답)을 살펴보다보니 재미있는 문제들이 많더군요.. 정말 자바의 기초적인 것들이지만 하나하나 엄청나게 중요한데도 불구하고 공부를 안했다는 생각에 실망감이 들었습니다. 하지만 실망감만 들었느냐? 그건 또 아니죠... 이렇게 많은 문제들을 틀릴때마다 하나씩 배워간다는 느낌이 들어서 좋기도하고.. 만감이 교차합니다 ^^;; 굉장히 재미있는것들이 많이 있었습니다. 그 첫 번째는 상속에서의 생성자의 재발견 이었습니다. 배웠던 기억이 있지만 역시 공부를 허접하게 한 티가 나는군요 ㅠㅠ;; 아래와 같은 소스코드가 문제의 보기로 나왔습니다. 이걸 실행시켰을때 콘솔창..
Stream - Scanning 자바를 처음 접하면서 Scanner라는 클래스 형의 객체를 사용하여 사용자로부터 Console 창에서 값을 입력 받을 수 있었습니다. Stream 에서 Scanner 클래스의 객체를 이용하여서 사용하는 튜토리얼이 나와 있었습니다. 기존에는 Scanner s = new Scanner(System.in); 이런식으로 사용 했는데 생성자의 인수가 inputStream 객체입니다. Scanner의 생성자를 살펴보면 InputStream만 인수로 받는다는것을 알수가 있습니다. Scanner(InputStream source) Constructs a new Scanner that produces values scanned from the specified input stream. Scanner(InputStream..
Stream - Line-Oriented I/O, BufferedStream ② Most of the examples we've seen so far use unbuffered I/O. This means each read or write request is handled directly by the underlying OS. This can make a program much less efficient, since each such request often triggers disk access, network activity, or some other operation that is relatively expensive. To reduce this kind of overhead, the Java platform implements buffered I/O streams. Buffer..