이 글에서는 JAVA 멀티스레딩의 동기화 키워드에 대한 몇 가지 지식 포인트를 객체 잠금으로 소개합니다.
소위 객체 잠금은 객체를 잠그는 동기화입니다. 객체 잠금에 대해서는 다음을 참조하세요. 이 기사
1. 분석
동기화는 다음 형식으로 인스턴스 메서드를 수정할 수 있습니다.
public class MyObject { synchronized public void methodA() { //do something.... }
여기서 동기화 키워드는 현재 개체를 잠급니다. 이것이 객체 잠금이라고 불리는 이유이기도 합니다.
현재 개체가 왜 잠겼나요? methodA()는 인스턴스 메소드이므로 methodA()를 실행하려면 object.method() 형식으로 호출해야 합니다. (obj.methodA(). obj는 MyObject 클래스의 객체입니다. 동기화된 잠금 개체 개체).
위 코드는 다음과 같이 작성할 수도 있습니다.
public class MyObject { public void methodA() { synchronized(this){ //do something.... } }
특징은 다음과 같습니다. 여러 개의 동기화된 인스턴스 메서드가 MyObject 클래스에 정의되어 있는 경우, 여러 스레드가 MyObject 클래스의 동일한 개체를 소유하는 경우 MyObject 클래스에서는 이러한 메서드를 동기 방식으로만 실행할 수 있습니다. 즉, 동기화된 수정 메서드를 실행한 후 다른 동기화된 수정 메서드를 실행할 수 있습니다.
은 다음과 같습니다.
MyObject 클래스에는 동기화되고 수정된 두 가지 메서드가 있습니다.public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB() { //do some other thing } }
public class ThreadA extends Thread { private MyObject object; //省略构造方法 @Override public void run() { super.run(); object.methodA(); } }
public class ThreadB extends Thread { private MyObject object; //省略构造方法 @Override public void run() { super.run(); object.methodB(); } }
public class Run { public static void main(String[] args) { MyObject object = new MyObject(); //线程A与线程B 持有的是同一个对象:object ThreadA a = new ThreadA(object); ThreadB b = new ThreadB(object); a.start(); b.start(); } }
public class MyObject { private String userName = "b"; private String passWord = "bb"; synchronized public void methodA(String userName, String passWord) { this.userName = userName; try{ Thread.sleep(5000); }catch(InterruptedException e){ } this.passWord = passWord; } synchronized public void methodB() { System.out.println("userName" + userName + ": " + "passWord" + passWord); } }