이 기사는 객체 잠금으로 Java 멀티 스레딩의 동기화 된 키워드에 대한 몇 가지 지식을 소개합니다.
소위 객체 잠금은 특정 객체를 잠그기 위해 동기화 된 것을 의미합니다. 참고 로이 기사를 참조하십시오
1. 분석
동기화 된 인스턴스 메소드를 다음과 같이 수정할 수 있습니다.
public class myObject {synchronized public void methoda () {// do do ....}여기서 동기화 된 키워드는 현재 객체를 잠그고 있습니다. 이것을 객체 잠금이라고도합니다.
현재 객체를 잠그는 이유는 무엇입니까? Methoda ()는 인스턴스 메소드이므로 Methoda ()를 실행하려면 객체 형태로 호출해야합니다. method () (obj.methoda (), obj는 myObject 클래스의 객체이며 동기화 된 것은 OBJ 객체를 잠그는 것을 의미합니다).
위의 코드는 다음과 같이 작성할 수 있습니다.
public class myobject {public void methoda () {synchronized (this) {// 뭔가 ....}}2. 기능
동기화 된 키워드 동기화의 명백한 기능은 여러 동기화 된 수정 된 인스턴스 메소드가 MyObject 클래스에서 정의 될 때, 여러 스레드가 MyObject 클래스의 동일한 객체를 갖는 경우 이러한 방법을 동기 방식으로 만 실행할 수 있다는 것입니다. 즉, 동기화 된 수정 방법을 실행 한 후 다른 동기화 된 수정 방법을 실행할 수 있습니다.
다음과 같이 :
public class myObject {synchronized public void methoda () {// do do ....myObject 클래스에는 두 가지 동기화 된 수정 방법이 있습니다.
public class orde stride는 스레드 {private myobject 객체; // 생성자 @override public void run () {super.run (); Object.Methoda (); }}스레드 a 메소드 () 실행
public class streadb는 stread {private myobject 객체; // 생성자 @override public void run () {super.run (); object.methodb (); }} 스레드 B는 메소드를 실행합니다.
public class run {public static void main (String [] args) {myObject Object = new myObject (); // 스레드 A와 스레드 B는 동일한 객체를 보유합니다. 객체 threada a = new Threada (Object); Threadb b = new Threadb (Object); a.start (); b.start (); }}스레드 A와 스레드 B는 동일한 myObject 클래스의 객체 객체를 유지하기 때문에이 두 스레드는 다른 메소드를 호출해야하지만 동기화되어야합니다. 예를 들어, 스레드 B는 Methodb () 메소드를 실행하기 전에 Methoda () 메소드를 실행하기 위해 스레드 A를 기다려야합니다.
3. 결론
위에서 볼 수 있듯이,이 기사에 설명 된 동기화 된 잠금의 범위는 전체 객체입니다. 클래스에 여러 개의 동기화 된 수정 된 동기화 방법이 있고 여러 스레드가 클래스의 동일한 객체 (클래스의 동일한 객체)를 유지하는 경우 각 메소드의 실행도 동기화됩니다.
각 동기화 된 방법 사이에 공유 변수가 없거나 각 방법 사이에 연결이 없지만 동기식으로 만 실행할 수있는 경우 효율에 영향을 미칩니다.
4. 응용 프로그램-데이터 불일치로 인한 더러운 데이터를 읽지 않도록 동기화 된 사용
다음 예제 :
공개 클래스 myObject {private String username = "b"; 개인 문자열 비밀번호 = "BB"; 동기화 된 public void methoda (문자열 사용자 이름, 문자열 암호) {this.username = username; try {thread.sleep (5000); } catch (InterruptedException e) {} this.Password = password; } synchronized public void methodb () {system.out.println ( "username" + username + ":" + "password" + password); }}Methoda ()는 사용자 이름과 비밀번호를 변경할 책임이 있습니다. 실제로 사용자 이름은 비밀번호에 해당합니다.
Methodb ()는 사용자 이름과 비밀번호를 읽을 책임이 있습니다.
Methodb ()가 동기화 된 상태에서 수정되지 않은 경우 Methoda ()을 7 행으로 호출 할 때 사용자 이름을 변경하고 어떤 이유로 든 CPU를 포기합니다 (예 : 9 행에서 수면).
이 시점에서 Thread B가 Methodb ()를 실행하면 읽기 읽기가 스레드 A ( "A")로 변경된 사용자 이름이지만 비밀번호는 원래 비밀번호 ( "BB")입니다. 스레드 A가 자고 있으며 암호를 변경할 시간이 없었기 때문입니다.
그러나 Methodb ()가 동기화 된 상태로 수정되면 스레드 B는 Methodb를 실행하기 전에 사용자 이름과 암호를 읽기 전에 실행을 완료하기 위해 스레드 A (즉, 사용자 이름과 암호를 변경했습니다) 만 기다릴 수 있습니다. 따라서 데이터의 불일치로 인한 더러운 읽기 문제는 피합니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람들이 Java 프로그래밍을 배우는 것이 도움이되기를 바랍니다.