java synchronized同步问题的理解
博客专区 > IamOkay 的博客 > 博客详情
java synchronized同步问题的理解
IamOkay 发表于3年前
java synchronized同步问题的理解
  • 发表于 3年前
  • 阅读 36
  • 收藏 1
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

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

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();
	}
	
}


共有 人打赏支持
粉丝 169
博文 426
码字总数 323864
×
IamOkay
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: