Java 스레드 동기화 잠금 선택

6498 단어 java 스레드

스레드 동기화가 필요할 때 어떻게 적당한 스레드 자물쇠를 선택합니까?
예: 상수 풀에 저장할 수 있는 객체, String 객체 등을 선택합니다.
public class SyncTest
{
    private String name = "name";
public void method(String flag)
    {
        synchronized (name)
        {
            System.out.println(flag + ", invoke method ....");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args)
    {
        SyncTest test1 = new SyncTest();
        
        SyncTest test2 = new SyncTest();
        
        MyThread1 myThread1 = new MyThread1();
        MyThread1 myThread2 = new MyThread1();
        myThread1.syncTest = test1;
        myThread2.syncTest = test1; 
        
        MyThread1 myThread3 = new MyThread1();
        MyThread1 myThread4 = new MyThread1();
        myThread3.syncTest = test2;
        myThread4.syncTest = test2;
        
        myThread1.start();
        myThread2.start();
        myThread3.start();
        myThread4.start();
        
    }


}

스레드 클래스:
public class MyThread1 extends Thread
{
    SyncTest syncTest;
    
    @Override
    public void run()
    {
        syncTest.method(this.getName());
    }

}

원래는 스레드thread1과thread2가 동기화되고, 스레드thread3과thread4가 동기화되어야 하는데, 결과는?
그러나 라인thread1,thread2,thread3,thread4가 동기화되어 답답합니다.
나는 선택한 동기화 잠금 대상을 추천한다.
package com.rcx.thread;


public class SyncTest
{
    //  instance , 
    private byte[] lock = new byte[0];
    
    public void method(String flag)
    {
        synchronized (lock)
        {
            System.out.println(flag + ", invoke method f....");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args)
    {
        SyncTest test1 = new SyncTest();
        
        SyncTest test2 = new SyncTest();
        
        MyThread1 myThread1 = new MyThread1();
        MyThread1 myThread2 = new MyThread1();
        myThread1.syncTest = test1;
        myThread2.syncTest = test1; 
        
        MyThread1 myThread3 = new MyThread1();
        MyThread1 myThread4 = new MyThread1();
        myThread3.syncTest = test2;
        myThread4.syncTest = test2;
        
        myThread1.start();
        myThread2.start();
        myThread3.start();
        myThread4.start();
        
    }


}

0 길이의 byte 그룹을 동기화 자물쇠 대상으로 사용하는 것을 추천합니다. 의아한 오류가 발생하지 않을 뿐만 아니라 큰 메모리를 차지하지 않습니다.

좋은 웹페이지 즐겨찾기