*聖思園java se培訓總結(102-)(synchronized相關)

  1. synchronized只能修飾方法,和修飾一個代碼塊!
  2. //修飾一個塊
    syschronized(一個對象) { 。。。。 }

     

    java中的每個對象都有一個鎖(lock),或者叫監視器,當這個對象訪問一個synchronized方法的時候,表示將這個對象上鎖,此時其它任何線程都沒法再去訪問這個synchronized方法了!直到以前那個線程執行完畢方法後或者拋出異常,那麼將該對象的鎖釋放掉,其它線程就能夠訪問該synchronized方法。
  3. 若是一個對象有多個synchronized方法,在某一時刻,一個線程進入到某個synchronized方法後,那麼在這個方法沒有執行完畢前,其它線程是沒法訪問該對象的任何synchronized方法!
  4. 若是有多個對象多個線程訪問一個synchronized方法,這樣狀況下,多個線程都會隨機的去訪問該方法,只會鎖住對應的對象。
  5. //若是有多個對象多個線程訪問一個static synchronized的方法,則此方法每次只容許一個對象調用
  6. 若是某個syschronized方法是static的,那麼當多個線程訪問這個方法的時候,它鎖的不是synchronized方法所在的的對象,而是鎖的是所在對象對應的Class對象,由於java中不管有多少個對象,這些對象會對應一個Class對象,所以當線程分別訪問同一個類的多個對象的static synchronized方法時,他們的執行順序也是順序的,也就是說一個線程先去執行方法,執行完畢後,另外一個線程纔開始執行。
  7. 下面的代碼,請根據上面的規則本身修改,而後測試
package com.yuxi.lesson102;

public class SynchronizedDemo
{
	public static void main(String[] args)
	{
		Event event = new Event();
		Event event2 = new Event();
		MyThread1 myThread = new MyThread1(event);
		MyThread2 myThread2 = new MyThread2(event2);
		new Thread(myThread).start();
		new Thread(myThread2).start();
		Event.doThingOne();
	}

}

class Event
{
	public static synchronized void doThingOne()
	{
		for (int i = 0; i <20; i++)
		{
			try
			{
				Thread.sleep((long) (Math.random()*100));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println("事情1正在作"+i);
		}
		System.out.println("作完了事情1");
	}
	public synchronized void doThingTwo()
	{
		for (int i = 0; i <20; i++)
		{
			try
			{
				Thread.sleep((long) (Math.random()*100));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println("事情2正在作"+i);
		}
		System.out.println("作完了事情2");
	}
}

class MyThread1 implements Runnable
{
	private Event event;
	public MyThread1(Event event)
	{
		this.event = event;
	}
	@Override
	public void run()
	{
		this.event.doThingOne();
	}
	
}
class MyThread2 implements Runnable
{
	private Event event;
	public MyThread2(Event event)
	{
		this.event = event;
	}
	@Override
	public void run()
	{
		this.event.doThingOne();
	}
	
}
相關文章
相關標籤/搜索