JAVA 스레드 동기화 인스턴스 자습서
우선, 라인을 잠그면 무슨 소용이 있습니까?예를 들어 당신은 지금 3만 위안의 대양이 은행에 예금되어 있습니다. 지금 당신은 은행에 가서 돈을 찾으세요. 비밀번호를 입력한 후에 이미 인출 금액을 입력했습니다. 예를 들어 당신이 입력한 것은 20000입니다. 바로 은행이 당신에게 돈을 가져다 줄 때 당신의 마누라도 은행에 가서 이 돈을 찾으면 당신의 마누라도 똑같이 20000을 찾습니다. 왜냐하면 이때 당신의 장부는 여전히 30000이기 때문에 은행과 같은 조작은 당신의 마누라에게 다시 한 번 진행되었습니다.이렇게 하면 너희 둘이 각자의 조작을 끝낸 후에 은행이 기록한 너의 장부에 만 위안의 예금이 있어야 한다. 이렇게 하면 매우 시원하지 않겠니?이 문제를 해결하는 데는 라인과 자물쇠를 넣는 지식이 쓰였으니 다음은 우리 함께 공부합시다.
1. 미처리 스레드 동기화의 예:
public class TextSync implements Runnable{
/**
* @param args
*/
Time time = new Time();
public static void main(String[] args) {
TextSync text = new TextSync();
Thread t1 = new Thread(text);
Thread t2 = new Thread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
time.add(Thread.currentThread().getName());
}
}
class Time {
private static int num = 0;
public void add(String name){
try {
num++;
// ,num 1, ,
// , ,num 2, ,
// num 2, 2;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+" "+num+" 。");
}
}
출력 결과:
t2 2 。
t1 2 。
2. 스레드 동기화
public class TextSynctwo implements Runnable{
/**
* @param args
*/
Time1 time = new Time1();
public static void main(String[] args) {
TextSynctwo text = new TextSynctwo();
Thread t1 = new Thread(text);
Thread t2 = new Thread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
time.add(Thread.currentThread().getName());
}
}
class Time1 {
private static int num = 0;
//synchronized , , 。
public synchronized void add(String name){
//synchronized (this) {// ,
try {
num++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+" "+num+" 。");
//}
}
}
출력 결과:
t1 1 。
t2 2 。
3. 자물쇠
public class TestDeadLock implements Runnable{
/**
* @param args
*/
private int flag = 0 ;
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 2;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
if(flag == 1){
synchronized(o1){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag == 2){
synchronized(o2){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1){
System.out.println("2");
}
}
}
}
}
4. 잠금
public class TT implements Runnable{
/**
* @param args
*/
int b = 100;
public static void main(String[] args) {
TT tt = new TT();
Thread th = new Thread(tt);
th.start();
try {
tt.m2();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(tt.b);
}
@Override
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
private synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
private synchronized void m2() throws Exception{
Thread.sleep(2500);
b = 2500;
}
}
현재 출력 결과는 다음과 같습니다.
1000
b=1000
여기에서 m2가 먼저 실행되고 m1은 m2가 실행이 끝난 후에야 실행할 수 있음을 알 수 있다.본 논문이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.