스레드 실행은 인스턴스의 메소드가 동기화되면 인스턴스당 하나의 스레드 실행이 되지만, 동일한 클래스의 인스턴스가 두 개 이상 있을 경우에만 제공하기 위해 클래스 수준에서 동기화가 필요한 문제가 됩니다. 객체 수준에서 동기화하는 것보다 클래스의 모든 인스턴스에 대해 하나의 잠금을 설정합니다. 이를 Java에서는 정적 동기화라고 하며 두 가지 방법으로 수행할 수 있습니다. 하나는 정적 동기화 메서드를 사용하고 다른 하나는 동기화된 블록을 사용하는 것입니다. 정적 메소드 내의 코드.
무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
구문은 다음과 같습니다.
synchronized static return_type class_name{}
여기서 반환 유형은 클래스에서 반환된 값의 유형이고 class_name은 클래스의 이름입니다.
클래스의 각 인스턴스에는 Java의 클래스 객체에 대한 잠금이 있습니다. 정적 메서드가 동기화되면 잠금은 클래스 개체에 있지 않고 클래스 자체에 적용됩니다. obj1과 obj2라는 클래스의 두 개체가 있고 스레드 t1과 t2가 개체 obj1에서 작동하고 있다고 가정해 보겠습니다. 마찬가지로 스레드 t3 및 t4는 객체 obj2에서 작동 중입니다. 코드 블록이나 메서드가 동기화되면 스레드 t1과 t2 모두 단일 잠금이 있는 동일한 개체 obj1을 참조하므로 스레드 t1과 t2 사이에 간섭이 있을 수 없습니다. 마찬가지로 스레드 t3과 t4 모두 단일 잠금이 있는 동일한 객체 obj2를 참조하기 때문에 스레드 t3과 t4 사이에는 간섭이 있을 수 없습니다.
그러나 스레드 t1과 t3 모두 서로 다른 잠금을 사용하여 서로 다른 객체를 얻었으므로 스레드 t1과 t3 사이에 간섭이 있을 수 있습니다. 마찬가지로, 스레드 t2와 t4 모두 서로 다른 잠금을 사용하여 서로 다른 객체를 획득했기 때문에 스레드 t2와 t4 사이에 간섭이 있을 수 있습니다. 우리는 스레드 간에 어떤 종류의 간섭도 원하지 않으며 이 문제는 Java의 정적 동기화를 사용하여 해결할 수 있습니다. 클래스 객체는 클래스 로드가 처음으로 발생할 때 Java Virtual Machine에 의해 생성됩니다. 클래스를 처음 로드한 후에는 동일한 클래스가 다시 로드되지 않습니다. Java Virtual Machine에 의해 로드되는 모든 클래스에 대해 클래스의 인스턴스가 생성됩니다. 이러한 클래스 인스턴스를 객체라고 하며 객체 동기화는 Java의 정적 동기화를 사용하여 수행할 수 있습니다.
아래는 예시입니다.
Java의 정적 동기화를 시연하는 프로그램:
코드:
//a class called check is defined class check { // a method called Line is define and only one thread will be able to access this method at once because it is synchronized synchronized public void Line() { //a for loop is defined to loop from values 0 to 3 for (int r = 1; r <5; r++) { System.out.println(r); try { Thread.sleep(390); } catch (Exception ex) { System.out.println(ex); } } } } //a class called Trap is defend which extends a thread of the class class Trap extends Thread { //a variable of the class check is defined check line1; //a constructor of the class trap is defined with check class variable Trap(check line1) { this.line1 = line1; } //the standard run method is overridden public void run() { line1.Line(); } } //a class called program is defined public class program { //main method is called public static void main(String[] args) { //an instance of the class check is defined check object = new check(); // two threads of the class trap is created and they share the same object Trap tra1 = new Trap(object); Trap tra2 = new Trap(object); //Beginning the execution of two threads tra1.start(); tra2.start(); } }
출력:
설명: 위 프로그램에는 check라는 클래스가 정의되어 있습니다. 그런 다음 Line이라는 메서드가 정의되고 동기화되므로 한 번에 하나의 스레드만 이 메서드에 액세스할 수 있습니다. 그런 다음 값 0에서 3까지 반복하도록 for 루프가 정의됩니다. 그런 다음 클래스의 스레드를 확장하는 Trap이라는 클래스가 방어됩니다. 그런 다음 클래스 검사의 변수가 정의됩니다. 클래스 트랩의 생성자는 검사 클래스 변수를 매개변수로 사용하여 정의됩니다. 그런 다음 표준 실행 방법이 재정의됩니다. 그런 다음 프로그램이라는 클래스가 정의됩니다. 그런 다음 기본 메서드가 호출됩니다. 그런 다음 클래스 검사 인스턴스가 정의됩니다. 그런 다음 클래스 트랩의 두 스레드인 tra1 및 tra2가 생성되고 동일한 개체를 공유합니다. 그런 다음 두 스레드 tra1 및 tra2의 실행은 한 스레드의 실행이 다른 스레드의 실행을 방해하지 않거나 한 스레드의 실행이 다른 스레드의 실행을 잠그지 않는 방식으로 시작됩니다. 프로그램의 출력은 위의 스냅샷과 같습니다.
여러 가지 장점이 있습니다. 그들은:
이 튜토리얼에서는 정의를 통해 Java의 정적 동기화 개념, Java에서 정적 동기화를 선언하는 구문, 예제를 통해 Java에서 정적 동기화 작업 및 해당 출력과 Java에서 정적 동기화의 장점을 이해합니다.
위 내용은 Java의 정적 동기화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!