文档章节

java synchronized同步问题的理解

IamOkay
 IamOkay
发布于 2014/11/11 23:31
字数 362
阅读 44
收藏 1

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


© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 458
码字总数 370664
作品 0
海淀
程序员
再有人问你synchronized是什么,就把这篇文章发给他。

在《深入理解Java虚拟机》中,有这样一段话: synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作...

Java填坑之路
08/07
0
0
跳槽时,这些Java面试题99%会被问到

我在 Oracle 已经工作了近 7 年,面试过从初级到非常资深的Java工程师,且由于 Java 组工作任务的特点,我非常注重面试者的计算机科学基础和编程语言的理解深度,可以不要求面试者非要精通 ...

Java小铺
08/15
0
0
synchronized与ThreadLocal

synchronized是实现java的同步机制。同步机制是为了实现同步多线程对相同资源的并发访问控制。保证多线程之间的通信。 同步的主要目的是保证多线程间的数据共享。同步会带来巨大的性能开销,...

bigYuan
2013/07/18
0
2
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
Java多线程下 ThreadLocal 的应用实例

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。...

空云万里晴
2014/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
47分钟前
4
1
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
57分钟前
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0
麒麟AI首席科学家现世

8月31日,华为发布了新一代顶级人工智能手机芯片麒麟980,成为全球首款7nm工艺手机芯片,AI方面也实现飞跃,支持人脸识别、物体识别、物体检测、图像分割、智能翻译等。 虽然如今人人都在热议...

问题终结者
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部