목차
synchronized
머리말
线程同步方法
线程同步块
详细原因
注意
스레드 동기화 방법
출력 결과는 아래와 같습니다
스레드 동기화 블록
자세한 이유
Java java지도 시간 동기화란 무엇입니까? 동기화를 사용하는 방법은 무엇입니까?

동기화란 무엇입니까? 동기화를 사용하는 방법은 무엇입니까?

Jun 21, 2017 pm 01:27 PM
synchronized

synchronized

머리말

운영 체제를 배울 때 하나의 지식 포인트는 한 번에 하나의 프로세스에서만 작동할 수 있는 리소스입니다. 멀티 스레딩을 사용하면 동시에 작동하며 동시에 하나의 리소스에 대한 액세스 및 수정을 제어할 수 없습니다. 제어하려는 경우 오늘은 첫 번째 방법인 스레드 동기화 블록 또는 스레드 동기화에 대해 이야기하겠습니다. 메서드( 동기화)

  1. 다음은 synchronized 키워드synchronized关键字的使用

线程同步方法

public class Sychor {public void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
로그인 후 복사

其中输出结果为下图

동기화란 무엇입니까? 동기화를 사용하는 방법은 무엇입니까?

从上面的结果可以看出这里的两个线程是同时执行insert()方法的,下面我们在原有的代码上添加synchronized关键字看看效果如何,代码如下:

public class Sychor {public synchronized void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
로그인 후 복사

上面程序的동기화란 무엇입니까? 동기화를 사용하는 방법은 무엇입니까?我就不列出来,自己可以试试,总之就是加上了synchronized关键字使得线程是一个一个的执行的,只有先执行完一个线程才能执行了另外一个线程。

线程同步块

当然上面的我们使用的是线程同步方法,我们可以使用线程同步块,这两个相比线程同步块更加灵活,只需要将需要同步的代码放在同步块中即可,代码如下;

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
            
        }
        

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
로그인 후 복사

从上面的代码中可以看出这种方式更加灵活,只需要将需要同步的代码方法在同步块中,不需要同步的代码放在外面

详细原因

  1. 我们知道每一个对象都有一把锁,当我们使用线程同步方法或者线程同步块的时候实际上获得是对象的唯一的一把锁,当一个线程获得了这唯一的锁,那么其他的线程只能拒之门外了,注意这里我们说是一个对象,也就是说是同一个对象,如果是不同的对象,那么就不起作用了,因为不同对象有不同的对象锁,比如我们将上面的程序改成如下:

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
        }

    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor sychor = new Sychor();   //在run() 方法中创建一个对象sychor.insert(Thread.currentThread());
            };
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor sychor = new Sychor();  //创建另外的一个对象sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
로그인 후 복사

从上面的结果可知,此时线程同步块根本不起作用,因为他们调用的是不同对象的insert方法,获得锁是不一样的

  1. 上面我们已经说过一个对象有一把锁,线程同步方法和线程同步块实际获得的是对象的锁,因此线程同步块的括号中填入的是this,我们都知道this在一个类中的含义

  1. 一个类也有唯一的一把锁,我们前面说的是使用对象调用成员方法,现在如果我们要调用类中的静态方法,那么我们可以使用线程同步方法或者同步块获得类中的唯一一把锁,那么对于多个线程同时调用同一个类中的静态方法就可以实现控制了,代码如下:

public class Sychor {// 静态方法public static synchronized void insert(Thread thread)  
    {for(int i=0;i<10;i++)
        {
            System.out.println(thread.getName()+"输出     "+i);
        }
    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());  //直接使用类调用静态方法};
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());   //直接使用类调用静态方法};
        };

        t1.start();
        t2.start();
    }
}
로그인 후 복사

注意

  1. 要想实现线程安全和同步控制,如果执行的是非static同步方法或者其中的同步块,那么一定要使用同一个对象,如果调用的是static同步方法或者其中的同步块那么一定要使用同一个类去调用

  1. 如果一个线程访问的是static同步方法,而另外一个线程访问的是非static的同步方法,此时这两个是不会发生冲突的,因为一个是类的锁,一个是对象的锁

  1. 如果使用线程同步块,那么同步块中的代码是控制访问的,但是外面的代码是所有线程都可以访问的

  1. 当一个正在执行同步代码块的线程出现了异常,那么jvm

스레드 동기화 방법

rrreee

출력 결과는 아래와 같습니다

 Running results

위 결과에서 여기 두 스레드가 insert() 메서드를 동시에 실행하는 것을 볼 수 있습니다. 다음으로 synchronized를 원래 코드에 적용하여 효과를 확인하면 코드는 다음과 같습니다.🎜🎜
rrreee
🎜🎜실행 목록은 표시하지 않겠습니다. 위 프로그램의 결과를 직접 시도해 볼 수 있습니다. 간단히 말해서 synchronized 키워드가 추가되어 스레드가 하나씩 실행됩니다. 한 스레드가 먼저 실행되어야 다른 스레드가 실행될 수 있습니다. 🎜🎜

스레드 동기화 블록

🎜🎜물론 위의 스레드 동기화 방법을 사용했지만 스레드 동기화 블록을 사용할 수 있습니다. 이 두 가지는 스레드 동기화 블록보다 더 유연하며 동기화해야 하는 코드만 동기화 블록에 넣으면 코드는 다음과 같습니다. 🎜🎜
rrreee
🎜🎜위 코드에서 볼 수 있듯이 이 방법이 더 유연합니다. 동기화가 필요한 코드 메서드를 추가합니다. 동기화할 필요가 없는 코드는 외부에 배치됩니다. 🎜🎜

자세한 이유

🎜🎜🎜🎜우리는 각 객체를 알고 있습니다. 스레드 동기화를 사용할 때 잠금이 있습니다. 메서드나 스레드가 블록을 동기화할 때 실제로는 개체에 대한 유일한 잠금을 획득합니다. 스레드가 이 고유한 잠금을 획득하면 다른 스레드만 종료될 수 있습니다. 여기서는 객체라고 하며, 즉 동일한 객체라고 말합니다. 객체가 다르면 객체 잠금이 다르기 때문에 작동하지 않습니다. 예를 들어 위 프로그램을 다음과 같이 변경합니다. 다음: 🎜🎜🎜🎜
rrreee
🎜🎜위 결과를 보면 현재 스레드 동기화 블록이 전혀 작동하지 않는 것을 알 수 있습니다. 왜냐하면 스레드의 insert 메소드를 호출하기 때문입니다. 다른 객체, 그리고 잠금을 얻는 것은 다릅니다🎜🎜 🎜🎜🎜🎜위에서 객체에 잠금이 있다고 말했습니다. 스레드 동기화 방법과 스레드 동기화 블록은 실제로 객체의 잠금을 얻습니다. 스레드 동기화 블록의 괄호는 this로 채워집니다. 우리 모두는 클래스🎜🎜🎜🎜🎜🎜🎜🎜클래스에서 this의 의미를 알고 있습니다. 고유 잠금 앞서 말한 것은 개체를 사용하여 멤버 메서드를 호출하는 것입니다. 이제 클래스에서 정적 메서드를 호출하려면 스레드 동기화 메서드나 동기화 블록을 사용하여 유일한 잠금을 얻을 수 있습니다. 클래스를 잠그면 여러 스레드가 동시에 동일한 클래스의 정적 메서드를 호출하여 달성할 수 있습니다. 제어되는 코드는 다음과 같습니다. 🎜🎜🎜🎜
rrreee
🎜Note🎜🎜🎜🎜🎜실행이 비정적인 경우 스레드 안전성과 동기화 제어를 달성하려면 >동기화된 메서드 또는 동기화된 블록이 정적 동기화 메서드 또는 동기화된 블록인 경우 동일한 개체를 사용해야 합니다. 호출된 경우 동일한 클래스를 사용하여 호출해야 합니다. 한 스레드가 정적 동기화 메서드에 액세스하고 다른 스레드가 비정적 동기화 메서드에 액세스하는 경우 두 스레드는 충돌하지 않습니다. 하나는 클래스 잠금이고 다른 하나는 객체 잠금이기 때문입니다🎜 🎜🎜🎜🎜🎜🎜🎜스레드 동기화 블록을 사용하는 경우 동기화 블록의 코드는 액세스가 제어되지만 외부 코드는 모든 스레드에서 액세스 가능합니다. 🎜🎜🎜🎜🎜🎜🎜🎜동기화된 코드 블록이 실행 중일 때 스레드에서 예외가 발생하면 jvm은 현재 스레드가 차지한 잠금을 자동으로 해제하므로 교착 상태가 발생하지 않습니다. 예외🎜🎜🎜🎜🎜참조 기사🎜🎜🎜🎜🎜🎜

위 내용은 동기화란 무엇입니까? 동기화를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java의 동기화 원리 및 사용 시나리오와 Callable 인터페이스의 사용 및 차이점 분석 Java의 동기화 원리 및 사용 시나리오와 Callable 인터페이스의 사용 및 차이점 분석 Apr 21, 2023 am 08:04 AM

1. 기본 기능 1. 낙관적 잠금으로 시작하여 잠금 충돌이 빈번하면 비관적 잠금으로 변환됩니다. 2. 경량 잠금 구현으로 시작하여 잠금이 오랫동안 유지되면 잠금이 해제됩니다. 3. 경량 잠금을 구현할 때 가장 많이 사용되는 스핀 잠금 전략 4. 불공정 잠금 5. 재진입 잠금 6. 읽기-쓰기 잠금이 아님 2. JVM 잠금 프로세스를 동기화합니다. 잠금은 잠금 없음, 편향된 잠금, 경량 잠금 및 중량 잠금 상태로 구분됩니다. 상황에 따라 순차적으로 업그레이드될 예정입니다. 편향된 자물쇠는 남자 주인공이 자물쇠이고 여자 주인공이 실이라고 가정합니다. 이 스레드만 이 자물쇠를 사용하면 남자 주인공과 여자 주인공은 결혼 증명서를 받지 못해도 영원히 행복하게 살 수 있습니다. -비용 운영) 그러나 여성 조연이 나타납니다.

Java 키워드 동기화 원리 및 잠금 상태 예시 분석 Java 키워드 동기화 원리 및 잠금 상태 예시 분석 May 11, 2023 pm 03:25 PM

1. Java의 잠금 개념 스핀 잠금: 스레드가 잠금을 획득할 때 다른 스레드가 잠금을 획득한 경우 스레드는 루프에서 대기한 후 다음까지 잠금을 성공적으로 획득할 수 있는지 계속 판단합니다. 잠금이 획득되면 루프가 종료됩니다. 낙관적 잠금: 충돌이 없다고 가정하고 데이터 수정 시 이전에 획득한 데이터와 일치하지 않는 데이터가 발견되면 최신 데이터를 읽고 수정을 다시 시도합니다. 비관적 잠금: 동시성 충돌이 발생할 것이라고 가정하고 데이터와 관련된 모든 작업을 동기화하며 데이터를 읽는 시점부터 잠금을 시작합니다. 배타적 잠금(쓰기): 리소스에 쓰기 잠금을 추가합니다. 스레드는 리소스를 수정할 수 있지만 다른 스레드는 리소스를 다시 잠글 수 없습니다(단일 쓰기). 공유 잠금(읽기): 리소스에 읽기 잠금을 추가한 후에는 읽을 수만 있고 수정할 수는 없습니다. 다른 스레드는 읽기 잠금만 추가할 수 있고 쓰기 잠금(다중)은 추가할 수 없습니다. S로 본다

Java에서 동기화 메커니즘을 구현하기 위해 동기화를 사용하는 방법은 무엇입니까? Java에서 동기화 메커니즘을 구현하기 위해 동기화를 사용하는 방법은 무엇입니까? Apr 22, 2023 pm 02:46 PM

Java 1에서 동기화를 사용하는 방법 요약입니다. 함수 수정자로 동기화를 사용하는 경우 샘플 코드는 다음과 같습니다. Publicsynchronizedvoidmethod(){//….} 이것이 동기화 방법입니다. 그러면 이때 어떤 개체가 동기화됩니까? 그가 잠그는 것은 이 동기화된 메소드 객체를 호출하는 것입니다. 즉, 객체 P1이 서로 다른 스레드에서 이 동기화 방법을 실행하면 이들 사이에 상호 배제가 형성되어 동기화 효과를 얻을 수 있습니다. 그러나 이 객체가 속한 Class에 의해 생성된 또 다른 객체 P2는 동기화 키워드를 추가하여 이 메소드를 임의로 호출할 수 있습니다. 위의 샘플 코드 등

Java의 세 가지 동기화 방법은 무엇이며 어떻게 사용합니까? Java의 세 가지 동기화 방법은 무엇이며 어떻게 사용합니까? Apr 27, 2023 am 09:34 AM

1. 동기화는 가장 일반적으로 사용되는 동기화 방법이며 이를 사용하는 세 가지 주요 방법이 있음을 설명합니다. 2. 예시//일반 클래스 메서드 동기화synchronousdpublidvoidinvoke(){}//클래스 정적 메서드 동기화 동기화publicstaticvoidinvoke(){}//코드 블록 동기화 동기화(객체){}이 세 가지 메서드의 차이점은 동기화되는 개체가 다르다는 것입니다. 일반 클래스는 객체 자체를 동기화하고, 정적 메서드는 클래스 자체를 동기화하며, 코드 블록은 대괄호 안에 채워진 객체를 동기화합니다. Java에는 어떤 컬렉션이 있나요?

Java 동기화 잠금 업그레이드의 원칙과 프로세스는 무엇입니까? Java 동기화 잠금 업그레이드의 원칙과 프로세스는 무엇입니까? Apr 19, 2023 pm 10:22 PM

도구 준비 동기화의 원리에 대해 공식적으로 이야기하기 전에 스핀 잠금에 대해 먼저 이야기하겠습니다. 스핀 잠금은 동기화 최적화에 큰 역할을 하기 때문입니다. 스핀락을 이해하려면 먼저 원자성이 무엇인지 이해해야 합니다. 소위 원자성은 단순히 각 작업이 완료되지 않았거나 완료되었음을 의미합니다. 예를 들어, 변수 데이터에 하나를 추가하려면 다음 세 단계가 있습니다. 데이터 추가 로드 메모리에서 레지스터로. 데이터 값에 1을 더합니다. 결과를 다시 메모리에 씁니다. 원자성은 스레드가 증분 작업을 수행할 때 이 스레드가 이 세 가지 프로세스를 완료할 때만 다른 스레드에 의해 중단될 수 없음을 의미합니다.

Java가 단순히 동기화된 키워드를 사용하는 대신 잠금을 제공해야 하는 이유는 무엇입니까? Java가 단순히 동기화된 키워드를 사용하는 대신 잠금을 제공해야 하는 이유는 무엇입니까? Apr 20, 2023 pm 05:01 PM

요약: 동기화된 키워드는 하나의 스레드만 동기화된 코드 블록에 액세스할 수 있도록 Java에서 제공됩니다. syncised 키워드가 제공되는데 Java SDK 패키지에 Lock 인터페이스도 제공되는 이유는 무엇입니까? 이것이 불필요한 바퀴의 재발명인가요? 오늘 우리는 이 문제에 대해 함께 논의해 보겠습니다. 동기화된 키워드는 하나의 스레드만 동기화된 코드 블록에 액세스할 수 있도록 Java에서 제공됩니다. syncised 키워드가 제공되는데 Java SDK 패키지에 Lock 인터페이스도 제공되는 이유는 무엇입니까? 이것이 불필요한 바퀴의 재발명인가요? 오늘은 함께 토론해보자

Java 동기화란 무엇입니까? Java 동기화란 무엇입니까? May 14, 2023 am 08:28 AM

동기화란 무엇입니까? Java 독자는 여러 미들웨어 소스 코드나 JDK 소스 코드에서 볼 수 있습니다. -스레딩 동기화는 스레드 안전성을 보장할 수 있습니다. 이를 뮤텍스 잠금(동시에 하나의 스레드만 실행할 수 있고 다른 스레드는 대기함)이라고 하며 비관적 잠금(동시에 하나의 스레드만 실행할 수 있으며 다른 스레드는 대기함)이라고도 합니다. 이를 구현하는 데 도움이 되도록 개발자는 동기화된 키워드만 사용하면 됩니다. 이를 사용할 때 객체를 잠금용 뮤텍스로 사용해야 합니다.

Java에는 몇 개의 비액세스 수정자가 있습니까? Java에는 몇 개의 비액세스 수정자가 있습니까? Aug 30, 2023 pm 06:01 PM

Java는 가시성 이상의 기능을 제공하기 위해 몇 가지 다른 수정자를 제공합니다. 이러한 수정자를 비액세스 수정자라고 합니다. static으로 선언된 정적 멤버는 클래스의 모든 인스턴스에 공통됩니다. 정적 멤버는 클래스 메모리에 저장되는 클래스 수준 멤버입니다. Final 이 수정자는 변수, 메서드 또는 클래스에 대한 추가 수정을 제한하는 데 사용됩니다. final로 선언된 변수의 값은 일단 값을 얻은 후에는 수정할 수 없습니다. Final 메서드는 하위 클래스에서 재정의될 수 없으며 Final 클래스의 하위 클래스를 만들 수도 없습니다. Abstract 이 수정자는 클래스 또는 메서드와 함께 사용할 수 있습니다. 변수와 생성자에는 이 수정자를 적용할 수 없습니다. abstract로 선언된 메서드는 서브클래스에서 수정되어야 합니다. abstract로 선언된 클래스를 인스턴스화할 수 없습니다. 동기 이 수정자는 여러 스레드를 제어하는 ​​데 사용됩니다.

See all articles