文档章节

java synchronized同步问题的理解

IamOkay
 IamOkay
发布于 2014/11/11 23:31
字数 362
阅读 48
收藏 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
粉丝 190
博文 461
码字总数 373670
作品 0
海淀
程序员
私信 提问
再有人问你synchronized是什么,就把这篇文章发给他。

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

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

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

Java小铺
08/15
0
0
Java多线程下 ThreadLocal 的应用实例

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

空云万里晴
2014/01/06
0
0
Java多线程学习(二)synchronized关键字(2)

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

一只蜗牛呀
04/16
0
0
synchronized与ThreadLocal

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

bigYuan
2013/07/18
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部