이 기사는 Java 스레드 동기화 구현 방법(코드 포함)에 대한 자세한 설명을 제공합니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.
스레드 동기화가 필요한 이유
파일과 같은 동일한 리소스에서 여러 스레드가 작동하는 경우 여러 스레드가 동시에 파일을 작동하도록 허용할 수 없습니다. 파일을 공유하면 여러 작업이 충돌하기 때문입니다. 팀 개발을 위해 git을 사용해보신 분들은 가격비교에 있어 깊은 경험을 하게 되리라 믿습니다.
이제 스레드 동기화 메커니즘을 도입해야 합니다.
소위 동기화는 하나씩 실행, 즉 여러 스레드가 실행을 위해 대기하므로 스레드 간에 선착순 관계가 있습니다. 이렇게 하면 싸움도 갈등도 없을 것입니다.
문제 설명
두 개의 스레드가 있는 프로그램입니다. 첫 번째 스레드는 2에서 1000 사이의 짝수와 숫자를 계산하고, 두 번째 스레드는 1000에서 2000 사이의 짝수와 숫자를 계산합니다.
초기 구현
먼저 주제에 따라 구현 방법을 설계해 보겠습니다.
1. 두 개의 스레드를 정의합니다. 여기서는 자신만의 스레드 클래스를 정의한 다음 짝수 계산의 시작과 끝을 설정해야 합니다
2. 주어진 범위 내에서 짝수 및 짝수의 계산을 구현합니다
3. 구현이 매우 간단하다는 것을 확인하세요. 예비 구현은 다음과 같습니다.
public class MyTread extends Thread {
private int begin; // 范围开始
private int end; // 范围结束
public MyTread(int begin, int end) {
this.begin = begin;
this.end = end;
}
}
@Override
public void run() {
this.getEven(begin, end);
}
// 获取偶数以及个数
private void getEven(int begin, int end) {
int count = 0;
System.out.println(begin + "~" + end + "之间的偶数为:");
if (begin % 2 != 0) {
begin += 1;
}
for (; begin
public static void main(String[] args) {
MyTread tread1 = new MyTread(2, 500);
MyTread tread2 = new MyTread(500, 1000);
tread1.start();
tread2.start();
}
참고: 나중에 효과를 보여주기 위해 여기에서는 수치 범위를 줄였습니다. 결과를 보세요:
우리가 원하는 효과는 아닌 것 같습니다. 우리는 이 효과를 원합니다:
우리는 각 부분의 짝수와 짝수가 함께 있기를 원하지만, 구현한 후의 효과는 실제로 두 부분이 혼동된다는 것입니다.
프로그램 개선위 문제를 해결하려면 처음에 이야기한 스레드 동기화
를 사용해야 합니다.
초기 소개에 따르면 동기화를 위한 한 가지 조건은 공유 리소스
가 있어야 한다는 것을 알아냈습니다. 그렇다면 우리 코드에서 이 공유 리소스
는 무엇인가요? 그렇지 않은 것 같습니다. 먼저 하나를 만드십시오. 线程同步
了。
根据我们开始的介绍,发现实现同步的一个条件就是有一个共享的资源
。那么我们的代码里什么是这个共享的资源
呢?貌似没有。所以先创建一个。
1.建立共享资源
我们这里的共享资源完全就可以是同一个对象
,所以我们就另外建立一个类,用来示例共享资源。
public class Even {}
2.然后在共享类中建立计算偶数的方法:
public class Even { /** * 获取某个范围内偶数以及个数 * @param begin 统计开始 * @param end 统计结束 */ public synchronized void getEven(int begin, int end) { int count = 0; System.out.println(begin + "~" + end + "之间的偶数为:"); if (begin % 2 != 0) { begin += 1; } for (; begin <p>细心的人会发现,这个方法跟我们最开始写的方法有点不同,它多了一个关键字:<code>synchronized</code></p><p>1. 공유 리소스 만들기<strong></strong></p>여기의 공유 리소스는 완전히 <code>동일한 개체</code>일 수 있으므로 공유 리소스 예시를 위해 다른 클래스를 만듭니다. <p></p><pre class="brush:php;toolbar:false">public class MyTread extends Thread { Even even; @Override public void run() { even.getEven(begin, end); } }
2. 그런 다음 공유 클래스에서 짝수를 계산하는 메서드를 만듭니다. /**
* 偶数类
*/
public class Even {
/**
* 获取某个范围内偶数以及个数
* @param begin 统计开始
* @param end 统计结束
*/
public synchronized void getEven(int begin, int end) {
int count = 0;
System.out.println(begin + "~" + end + "之间的偶数为:");
if (begin % 2 != 0) {
begin += 1;
}
for (; begin
주의 깊은 사람들은 이 메서드가 원래 작성한 메서드와 약간 다르다는 것을 알게 될 것입니다: . 동기화
. 이 키워드를 통해 메소드 실행 시 스레드 동기화를 달성할 수 있습니다.
이제 다시 실행해 보겠습니다.
위 내용은 Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!