Thread(5)-synchronized와 static이 만나면

2111 단어 synchronized
만약synchronized 방법이 static라면 라인이 이 방법에 접근할 때, 라인이synchronized 방법이 있는 대상이 아니라synchronized 방법이 있는 대상이 대응하는 클래스 대상이다. 이 대상들은 유일한 클래스 대상에 대응하기 때문에 라인이 같은 종류의 두 대상을 각각 방문하는 두 개의 static,synchronized 방법이 있을 때 그들의 실행 순서도 순서이다.즉, 한 라인이 먼저 집행하는 방법은 집행이 끝난 후에야 다른 라인이 집행되기 시작한다.
코드 예:

package com.test;

public class ThreadTest4
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Example example = new Example();

		Thread001 t1 = new Thread001(example);
		example = new Example();
		Thread002 t2 = new Thread002(example);
		t1.start();
		t2.start();
	}

}

//  
class Example
{
	//  1
	public synchronized static void outPut1()
	{
		for (int i = 0; i < 20; i++)
		{
			try
			{
				Thread.sleep((long) (Math.random() * 1000));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println("outPut1:" + i);
		}

	}

	//  2
	public synchronized static void outPut2()
	{
		for (int i = 0; i < 20; i++)
		{
			try
			{
				Thread.sleep((long) (Math.random() * 1000));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println("outPut2:" + i);
		}

	}
}

//  1
class Thread001 extends Thread
{
	private Example example;

	public Thread001(Example example)
	{
		this.example = example;
	}

	@Override
	public void run()
	{

		example.outPut1();
	}

}

//  2
class Thread002 extends Thread
{
	private Example example;

	public Thread002(Example example)
	{
		this.example = example;
	}

	@Override
	public void run()
	{

		example.outPut2();
	}

}


출력은 순차적으로 출력됩니다.

좋은 웹페이지 즐겨찾기