운영 체제의 프로세스와 스레드의 차이에 대한 간단한 이해 :
프로세스 : 각 프로세스에는 독립적 인 코드 및 데이터 공간 (프로세스 컨텍스트)이 있으며 프로세스 간 전환은 큰 오버 헤드가됩니다. 프로세스에는 1-N 스레드가 포함되어 있습니다. (프로세스는 가장 작은 자원 할당 단위입니다)
글타래 (쓰레드) : 동일한 유형의 스레드 공유 코드 및 데이터 공간. 각 스레드에는 독립적 인 러닝 스택 및 프로그램 카운터 (PC)가 있으며 스레드 전환 오버 헤드는 작습니다. (스레드는 CPU 일정의 가장 작은 단위입니다)
프로세스와 마찬가지로 실은 생성, 준비, 달리기, 차단 및 종료의 5 단계로 나뉩니다.
다중 프로세스는 운영 체제가 동시에 여러 작업 (프로그램)을 실행할 수 있음을 의미합니다.
멀티 스레딩은 동일한 프로그램에서 여러 순차 스트림이 실행되는 것을 나타냅니다. 우선, 돈을 절약하고 돈을 인출하는 것이 실행되어야하며 많은 고객이있을 수 있습니다. 이는 여러 스레드가 있어야하며 여러 스레드가 공동으로 은행을 운영하고 은행의 양을 동기화해야 함을 의미합니다. 스레드 안전을 보장함으로써 만.
이 코드 의이 예를 여기에 여기에 두십시오. 잘못된 것이 있다면 지적하십시오. 노인 이이 멀티 스레드 코드에 대해 물었 기 때문입니다.
우선, 은행,이 객체 모델의 생성.
package com.lxk.threadtest.bank;/*** 은행 모델, 총 금액 속성. * <p> * * @author lxk on 2017/6/26 */Public Class Bank {/** * 은행에 신생 자본을 제공하십시오. 그렇지 않으면 어떻게 사업을 할 수 있습니까? */private int sum = 200; // 이것은 다음과 같이 사용되지 않지만 올바른 잠금 메커니즘입니다 : 코드 블록 동기화. // Object obj = new Object (); /*** 비용 절감* [Synchronized-Sync Function]을 추가하지 않으면 멀티 스레드 안전 문제가 발생합니다. */public synchronized void add (int n) {// synchronized (obj) {sum = sum + n; try {thread.sleep (10);} catch (예외 무시) {} // 비용 절감 시간의 숫자가 더 많은 경우 저축 송금이 실제로 두 번 저축 작업을 수행한다는 것을 알 수 있습니다. System.out.println (thread.currentThread (). getName () + "... sum =" + sum); //}}/*** 돈 인출* [synchronized-sync function]을 추가하지 않으면 다중 스레드 안전 문제가 발생합니다. */public synchronized void red reture (int n) {if (sum -n> = 0) {sum = sum -n;} else {system.out.println ( "은행의 돈은 충분하지 않습니다!"); 돈을 절약합니다. system.out.println (thread.currentthread (). getName () + "... sum =" + sum);}}코드에는 저장 및 가져 오기,이 두 가지 방법 및 총 금액과 일부는 코드를 댓글을 달았습니다. 간단하고 이해하기 쉽고 다중 스레드 잠금 상호 배타적이며 스레드 간의 동기화를 보장합니다.
그러나 이것은 드문 방법입니다. 일반적으로 사용되는 방법은 동기화 된 키워드를 사용하여 동기화 방법을 수정하는 것입니다.
클라이언트 객체의 모델
Com.lxk.threadtest.bank;/*** 고객, runnable () 인터페이스를 구현하고 여러 사람이 함께 돈을 저축 할 수 있습니다** @author lxk on 2017/6/26*/public class empless runnable {/*** Saving Type*/static final string _add = "add";/***/stattation _ rets " 은행*/개인 은행 은행;/***돈, 저축 또는 철수*/개인 문자열 유형*/개인 문자열 유형;/***운영 수는 이론적으로 긍정적 인 숫자*/개인 int 시간입니다./***저축 또는 철수 할 수*/개인 int 머니 (public int money); 공개 고객 (은행, 문자열 유형, int 시간, int money) {this. money;}@public void run () {for (int x = 0; x <time; x ++) {if (type_add.equals (type)) {bank.add (money);} else if (type_reduce.equals (type)) {bank.reduce (money);}}}}.고객 개체로서, 많은 고객이 동시에 은행에 액세스 할 수 있으므로 저축 및 인출 운영은 스레드를 사용하여 구현됩니다.
속성은 값을 전달하도록 구성됩니다.
주요 방법
패키지 com.lxk.threadtest.bank;/** * 은행 입금 돈의 다중 스레드 인스턴스 * <p> * [요구 사항 :] * 은행에는 금고가 있습니다. * 각각 N * 100을 입금하거나 철회하는 예금자가 두 명 있습니다. * 목적 :이 프로그램에 보안 문제가 있습니까? 그렇다면 어떻게 해결해야합니까? * <p> * [문제를 찾는 방법 :] * 1. 어떤 코드가 멀티 스레드 코드인지 확인하십시오. * 2. 데이터를 명확하게 공유하십시오. * 3. 다중 스레드 코드의 어떤 진술이 공유 데이터에서 작동하는지 명확합니다. * * @author lxk on 2017/6/26 */public class main {public static void main (string [] args) {// 여러 고객 은행 및 여러 고객 은행 = New Bank (); int time = 10000; int money = 100; //이 고객을 저장합니다.이 고객은 새로운 고객 (은행, 고객 .type_add, time, time, money)을 절약합니다. customer.type_reduce, 시간, 돈); 스레드 t1 = 새 스레드 (c1); 스레드 t2 = 새 스레드 (c2); t1.start (); t2.start ();}}위 코드의 실제 작동 효과는 아래 그림에 나와 있습니다.
입금 시간과 돈 철수 시간이 적은 경우 두 스레드에 시퀀스가 있음을 알 수 있습니다. 따라서 우리는 더 많은 시간이 있습니다. 그런 다음 그림과 같이 상황을 볼 수 있습니다. 스레드 1은 돈을 인출하고 스레드 0이 돈을 절약 할 때 두 스레드가 저장 및 철수와 함께 인터리브 된 실행되며 패턴이 없음을 알 수 있습니다.
이것은 데이터 동기화를 보장합니다.
동기화를 벗어나는 방법, 즉 비정상적인 현상,
ADD 메소드의 동기화 된 키워드를 제거하고 시간 수를 줄이고 3 배로 변경하고 합의 초기 값을 0으로 설정할 수 있습니다. 코드를 다시 시도하십시오.
소위 비동기 현상을 찾을 수 있습니다.
위 그림의 오른쪽에서 동기화되지 않은 결과는 두 사람이 매번 100 번, 세 번 절약한다는 것입니다. 획득 한 총 수가 있습니까? 100,200,300,400,500,600. 시간이 오래 걸립니다.
그러나 작동 결과는 그렇지 않습니다
이 시점에서 ADD 메소드에 동기화 된 추가하면 왼쪽의 그래프 결과가 나타납니다. 이는 올바른 결과입니다.
나는 존재와 철수를 위해 또 다른 방법을 추가했습니다. 코드는 위의 모습이됩니다.
이것들은 거의 모든 스레드 간 동기화의 예입니다.
코드를 간단히 기록 할 것입니다. 사용하면 몇 분 안에 꺼낼 수 있습니다.
요약
위의 것은 은행 철수를 사용하여 Java Multithreaded Synchronization 문제를 시뮬레이션하는 것에 대한이 기사의 전체 코드입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Java 멀티 스레드 프로그래밍 예
Java 멀티 스레드 타이머 타이머의 원리 및 구현
Java는 티켓을 판매하여 멀티 스레딩을 이해합니다
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!