java synchronized同步问题的理解

java 中提到线程同步,其实有很多种方法,主流方法有3种,synchronized,Lock/ReetenLock,wait->notify机制

今天主要说明对synchronized的理解

首先要明白:java中的资源是指可共享的同一个对象资源(必须要能共享,否则不解释...,必须是同一件资源,否则也不解释...)

同步代码块

sychronized(obj) 
{
 //这里的obj最好是个类的成员变量或者当前类的对象this,必须是唯一的,可共享的(注:最好不要是静态变量,因为静态的具有全局性,
如果任务多的话,使用多线程,稍有逻辑处理不慎将变成死锁,这和静态同步方法类似)
}

普通同步方法

public synchronized void doTask(){
    //这里锁住了 this
}

静态同步方法

public synchronized static void doTask(){
    //这里锁住了类的Class,类Class是静态的,共享的资源  Class<?> thiz;
}

//等价于下面的形式

synchronized(MyClass.class){

}


下面给一个实例

class WorkTask implements Runnable {

	private int counter = 100;

	private boolean isDoTaskMethod;
	
	public void setDoTaskMethod(boolean isDoTaskMethod)
	{
		this.isDoTaskMethod = isDoTaskMethod;
	}
	
	@Override
	public void run() {

		while (counter>=0) 
		{
			System.out.println(Thread.currentThread().getName());
			synchronized (this) {
				counter--;
				System.err.println("A==>"+counter);
			}
			doTask();
		}
		
	}
	
	public synchronized void  doTask()
	{
		counter--;
		isDoTaskMethod = true;
		System.err.println("B==>"+counter);
	}

}

public class TestWorkTask {

	public static void main(String[] args) {
		
		WorkTask wt = new WorkTask();
		
		Thread t1 = new Thread(wt);
		Thread t2 = new Thread(wt);
		t1.start();
		t2.start();
		
		t1.yield();
	}
	
}


你可能感兴趣的:(java synchronized同步问题的理解)