1. 프로세스와 스레드의 개념
(1) 전통적인 운영 체제에서 프로그램은 독립적으로 실행할 수 없으며 자원 할당 및 독립적 인 운영의 기본 단위가 모두 프로세스입니다.
OS가없는 시스템에서 프로그램의 실행 방법은 순차적 실행입니다. 즉, 다른 프로그램을 실행하기 전에 한 프로그램이 실행되어야합니다. 다중 프로그램 환경에서 여러 프로그램을 동시에 실행할 수 있습니다. 프로그램 실행 방법 사이에는 상당한 차이가 있습니다. 운영 체제에서 프로세스 개념을 도입하는 것은 동시에 프로그램의 실행의 특성입니다.
사람들이 1960 년대에 프로세스 개념을 제안했기 때문에 프로세스는 항상 자원을 갖고 독립적으로 실행할 수있는 기본 단위로 OS에서 사용되어 왔습니다. 1980 년대 중반까지 사람들은 독립적으로 실행할 수있는 기본 단위 인 프로세스보다 작은 스레드를 제안하여 시스템 내에서 프로그램의 동시 실행 정도를 높이기 위해 시스템의 처리량을 더욱 증가시킵니다. 특히 1990 년대에 들어간 후 다중 프로세서 시스템이 빠르게 발전했습니다. 스레드는 프로세스보다 프로그램의 병렬 실행을 더 잘 개선하고 다중 프로세서의 장점을 완전히 가해 줄 수 있습니다. 따라서 OS의 성능을 향상시키기 위해 최근 몇 년 동안 출시 된 다중 프로세서 OS에 스레드가 도입되었습니다.
- 위는 "컴퓨터 운영 체제 - Tang Xiaodan 및 기타에 의해 편집 된 컴퓨터 운영 체제 에서 발췌 한 (Down Download Address) 에서 발췌 한 것입니다.
(2) 다음 수치는 Zhihu 사용자의 설명입니다.
위의 일반적인 이해를 통해 우리는 기본적으로 스레드와 프로세스가 무엇을하는지 알고 있습니다. 아래 프로세스 및 스레드에 대한 개념을 요약하겠습니다.
(3) 프로세스는 특정 데이터 세트에 대한 컴퓨터에서 프로그램의 실행 활동이며, 시스템 자원 할당 및 일정의 기본 단위이며 운영 체제 구조의 기초입니다. 초기 프로세스 지향 컴퓨터 구조에서 프로세스는 프로그램의 기본 실행 엔티티였습니다. 현대 스레드 지향 컴퓨터 구조에서 프로세스는 스레드의 컨테이너였습니다. 프로그램은 지침, 데이터 및 조직 양식에 대한 설명이며 프로세스는 프로그램의 엔티티입니다.
(4) 가벼운 프로세스 (LWP)라고도하는 스레드는 프로그램 실행 흐름의 가장 작은 단위입니다. 스레드는 프로그램에서 단일 순차 제어 프로세스입니다. 프로세스에서 비교적 독립적이고 예약 가능한 실행 장치는 시스템에서 CPU의 독립적 인 스케줄링 및 발송의 기본 단위이며, 이는 실행 프로그램의 스케줄링 단위를 나타냅니다. 단일 프로그램에서 여러 스레드를 동시에 실행하여 Multithreading이라는 다른 작업을 완료합니다.
(5) 프로세스와 스레드의 관계 :
2. Java는 멀티 스레딩 방법을 구현합니다
(1) 스레드를 상속하고 run () 메소드를 다시 작성하십시오
public class mythread는 스레드 {@override public void run () {while (true) {system.out.println (this.currentthread (). getName ()); }} public static void main (String [] args) {Mythread Thread = new Mythread (); thread.start (); // 스레드를 시작하는 올바른 방법}}출력 결과 :
스레드 -0thread-0thread-0 ...
또한 start () 메소드가 run () 메소드 대신 시작 () 메소드라는 것을 이해해야합니다. run () 메소드를 사용하면 실행하는 일반적인 방법입니다.
(2) 실행 가능한 인터페이스를 구현합니다
공개 클래스 Myrunnable Amplements Runnable {@override public void run () {System.out.println ( "123"); } public static void main (String [] args) {myrunnable myrunnable = new myrunnable (); 스레드 스레드 = 새 스레드 (myrunnable, "t1"); thread.start (); }}3. 스레드 안전
스레드 안전 개념 : 다중 스레드가 특정 클래스 (객체 또는 메소드)에 액세스 할 때 클래스는 항상 올바른 동작을 표시 할 수 있으며이 클래스 (객체 또는 메소드)는 스레드 안전입니다.
스레드 안전은 멀티 스레드에 액세스 할 때 잠금 메커니즘이 채택됩니다. 스레드가 클래스의 특정 데이터에 액세스하면 보호됩니다. 다른 스레드는 스레드가 읽을 때까지 액세스 할 수 없으며 다른 스레드는 사용할 수 없습니다. 데이터 불일치 또는 데이터 오염은 없습니다. 스레드는 안전하지 않으므로 데이터 액세스 보호가 제공되지 않습니다. 여러 스레드가 데이터를 차례로 변경할 수있어 결과 데이터가 더러워 질 수 있습니다. 여기서 일반적인 잠금 메커니즘은 다음과 같습니다. 동기화되었습니다
4. 동기화 된 수정 자
(1) 동기화 : 모든 객체와 방법에 잠금 장치를 추가 할 수 있으며 잠긴 코드를 "MUTEX 영역"또는 "임계 영역"이라고합니다.
(2) ** 사용하지 마십시오 ** 동기화 된 인스턴스 (코드 a) :
공개 클래스 Mythread는 스레드 {private int count = 5; @override public void run () {count-; system.out.println (this.currentthread (). getName () + "count :" + count);} public static void main (strings [] args) {mythread mythread = new mythread (); stlead (stlead 2)); Thread (Mythread, "strood2"); Thread Resure (shread 3 = new Thread (Mythread, "Thread3"); Thread Thread4 = New Thread (Mythread, "Thread4"); Thread Thread5 = New Thread (Mythread, "Thread5"); Thread1.start (); Thread2.Start (); Thread3.Start (); Thread4.start (); thread5.Start ();}}.출력의 한 가지 결과는 다음과 같습니다.
Thread3 count : 2thread4 count : 1thread1 count : 2thread2 count : 3thread5 count : 0
여러 스레드가 run () 메소드를 동시에 동시에 작동하고 카운트를 수정하여 오류가 발생하기 때문에 위의 결과가 올바르지 않음을 알 수 있습니다.
(3) ** 사용 ** 동기화 된 인스턴스 (코드 B) :
공개 클래스 Mythread는 스레드 {private int count = 5; @override public synchronized void run () {count-; System.out.println (this.currentThread (). getName () + "count :" + count); } public static void main (String [] args) {Mythread Mythread = new Mythread (); 스레드 스레드 1 = 새 스레드 (Mythread, "Thread1"); 스레드 스레드 2 = 새 스레드 (Mythread, "Thread2"); 스레드 스레드 3 = 새 스레드 (Mythread, "Thread3"); 스레드 스레드 4 = 새 스레드 (Mythread, "Thread4"); 스레드 스레드 5 = 새 스레드 (Mythread, "Thread5"); thread1.start (); Thread2.start (); Thread3.start (); Thread4.start (); Thread5.start (); }}출력 결과 :
Thread1 Count : 4thread2 count : 3thread3 count : 2thread5 count : 1thread4 count : 0
코드 A와 코드 B의 차이는 동기화 된 수정이 run () 메소드에 추가된다는 것을 알 수 있습니다.
설명은 다음과 같습니다.
여러 스레드가 Mythread Run 메소드에 액세스하면 동기화 된 수정이 사용되면 멀티 스레드가 큐에서 처리됩니다 (여기의 큐는 CPU 할당 순서에 따라 결정됩니다). 스레드가 동기화 된 수정 방법에서 코드를 실행하려면 먼저 잠금을 얻으려고합니다. 잠금 장치를 가져 오면 동기화 된 코드 본문의 내용을 실행합니다. 잠금을 얻을 수 없다면 스레드는 잠금을 얻을 때까지 계속 얻으려고합니다. 또한, 여러 스레드가 동시에 잠금을 위해 경쟁하므로 잠금 경쟁이 발생합니다.
5. 물체에 자물쇠가 있습니다! 다중 스레드와 다중 잠금!
하나의 객체에는 하나의 잠금 장치가 있고 여러 스레드에는 여러 개의 자물쇠가 있습니다! 먼저 아래 예제 코드 (코드 C)를 살펴 보겠습니다.
공개 클래스 멀티 스레드 {private int num = 200; public synchronized void printnum (String ThreadName, String Tag) {if (tag.equals ( "a")) {num = num -100; System.out.println (ThreadName + "tag a, num!"); } else {num = num -200; System.out.println (ThreadName + "tag" + tag + ", num =" + num); } public static void main (String [] args)은 인터럽트 exception {최종 멀티 스레드 multithread1 = new Multithread (); 최종 multithread multithread2 = 새로운 multithread (); 새 스레드 (new Runnable () {public void run () {multithread1.printnum ( "Thread1", "a");}}). start (); Thread.sleep (5000); System.out.println ( "Thread1이 실행되었는지 확인하기 위해 5 초 기다립니다!"); 새 스레드 (new runnable () {public void run () {multithread2.printnum ( "Thread2", "B");}}). start (); }}출력 결과 :
Thread1 Tag A, Num Over! Thread1 태그 A, NUM = 100WAIT 5 초를 설정하여 Resid1이 실행되었는지 확인하십시오! Thread2 Tag B, NUM을 설정하십시오! Thread2 Tag B, Num = 0
Multithread1과 Multithread2의 두 가지 객체가 있음을 알 수 있습니다. 여러 객체가 동일한 잠금을 사용하는 경우 위의 실행 결과는 다음과 같습니다. Thread2 Tag B, NUM = -100. 따라서 각 객체에는 해당 객체의 잠금이 있습니다.
동기화 된 키워드로 얻은 잠금은 코드 나 방법을 잠금으로 처리하는 대신 객체 잠금입니다. 따라서 스레드가 처음으로 동기화 된 키워드 메소드를 실행하는 위의 예제 코드 C에서 스레드는 메소드가 속하는 객체의 잠금을 보유합니다. 스레드는 서로 다른 두 개의 다른 물체의 두 개의 다른 잠금을 얻고 서로를 보완합니다.
따라서 정상적인 시나리오에서는 모든 객체가 가변 카운트에서 작동하는 상황이 있어야하므로이를 구현하는 방법은 무엇입니까? 정적을 추가하는 것은 매우 간단합니다. 우리는이 클래스의 모든 객체가 동일한 참조를 가지고 있으며, 몇 개의 개체가 인스턴스화 되더라도 호출은 메소드이며 코드는 다음과 같습니다 (코드 d).
공개 클래스 멀티 스레드 {private static int num = 200; public static synchronized void printnum (String ThreadName, String Tag) {if (tag.equals ( "a")) {num = num -100; System.out.println (ThreadName + "tag a, num!"); } else {num = num -200; System.out.println (ThreadName + "Tag B, Num Over!"); } system.out.println (ThreadName + "tag" + tag + ", num =" + num); } public static void main (String [] args)은 인터럽트 exception {최종 멀티 스레드 multithread1 = new Multithread (); 최종 multithread multithread2 = 새로운 multithread (); 새 스레드 (new Runnable () {public void run () {multithread1.printnum ( "Thread1", "a");}}). start (); Thread.sleep (5000); System.out.println ( "Thread1이 실행되었는지 확인하기 위해 5 초 기다립니다!"); 새 스레드 (new runnable () {public void run () {multithread2.printnum ( "Thread2", "B");}}). start (); }}출력 결과 :
Thread1 Tag A, Num Over! Thread1 태그 A, NUM = 100WAIT 5 초를 설정하여 Resid1이 실행되었는지 확인하십시오! Thread2 Tag B, NUM OVER! THREAD2 TAG B, NUM = -100 설정
변수와 방법에 정적 수정을 추가하면 필요한 시나리오를 실현할 수 있습니다. 또한 비 정적 정적 수정 방법 또는 변수의 경우 잠긴 객체를 보여줍니다.
6. 동기 및 비동기 객체 잠금
(1) 동기화
동기화의 개념은 공유입니다. 우리는 "공유"라는 단어가 공유 리소스가 아니라 동기화 할 필요가 없다는 것을 알아야합니다. 즉, 잠금 할 필요가 없습니다.
동기화의 목적은 스레드의 안전을 보장하는 것입니다. 실제로, 스레드 안전을 위해서는 두 가지 가장 기본적인 특성을 충족해야합니다. 원자력과 가시성;
(2) 비동기 화 : 비동기
비동기식의 개념은 서로 간의 제약이없는 독립이며, 둘 사이에는 관계가 없습니다.
(3) 샘플 코드 :
public class myObject {public void method () {system.out.println (thread.currentthread (). getName ()); } public static void main (String [] args) {Final myObject myObject = new myObject (); 스레드 t1 = new Thread (new Runnable () {public void Run () {myObject.Method ();}}, "t1"); 스레드 t2 = new 스레드 (new Runnable () {public void run () {myObject.Method ();}}, "t2"); t1.start (); t2.start (); }}위 코드에서 Method ()는 비동기 메소드입니다.
요약
위의 내용은이 기사의 전체 내용입니다. 스레딩, 프로세스 개념에 대한 초기 솔루션은 Java 멀티 스레딩에서 동기화됩니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨두고 지적하면 편집자가 제 시간에 모든 사람에게 답장을받습니다.