자바에서 동기화란 여러개의 스레드가 한 개의 자원을 사용하고자 할 때 해당 스레드만 제외하고 나머지는 접근을 못하도록 막는다.
동기화는 synchronized 식별자로 구현할 수 있다.
// 함수에 사용
public synchronized void method() {
}
// 객체 변수에 사용
private Object object = new Object();
public void method2() {
synchronized (object);
}
synchronized는 함수와 변수에 사용이 가능하다.
class User {
public void add(String name) {
System.out.println(name);
}
}
class UserThread extends Thread {
User user;
UserThread(User user, String name) {
super(name);
this.user = user;
}
public void run() {
try {
for (int i = 0; i < 3; i++) {
user.add(getName());
sleep(500);
}
} catch (InterruptedException e) {
System.err.println(e.getMessage());
}
}
}
public class SynchronizedStudy {
public static void main(String[] args) {
User user = new User();
UserThread p1 = new UserThread(user, "A1");
UserThread p2 = new UserThread(user, "B2");
UserThread p3 = new UserThread(user, "C3");
p1.setPriority(Thread.MAX_PRIORITY);
p2.setPriority(Thread.NORM_PRIORITY);
p3.setPriority(Thread.MIN_PRIORITY);
p1.start();
p2.start();
p3.start();
}
}
위와 같이 동기화를 하지 않으면 출력값이 차례대로 되지 않는 경우가 생긴다.
class User {
public synchronized void add(String name) {
System.out.println(name);
}
}
class UserThread extends Thread {
User user;
UserThread(User user, String name) {
super(name);
this.user = user;
}
public void run() {
try {
for (int i = 0; i < 3; i++) {
user.add(getName());
sleep(500);
}
} catch (InterruptedException e) {
System.err.println(e.getMessage());
}
}
}
public class SynchronizedStudy {
public static void main(String[] args) {
User user = new User();
UserThread p1 = new UserThread(user, "A1");
UserThread p2 = new UserThread(user, "B2");
UserThread p3 = new UserThread(user, "C3");
p1.setPriority(Thread.MAX_PRIORITY);
p2.setPriority(Thread.NORM_PRIORITY);
p3.setPriority(Thread.MIN_PRIORITY);
p1.start();
p2.start();
p3.start();
}
}
add 함수에 synchronized를 적용한 결과 차례대로 나오는 것을 알수 있다.