`

Thread(5)--当synchronized和static相遇之后

 
阅读更多
如果某个synchronized 方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的俩个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();
	}

}


输出为顺序输出。
分享到:
评论
2 楼 onlyOneToOne 2011-09-15  
虚弱的java 写道
,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。 

在video中学到的
1 楼 虚弱的java 2011-09-15  
,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。 

相关推荐

Global site tag (gtag.js) - Google Analytics