文档章节

Java之同步

哦_呢称
 哦_呢称
发布于 2017/07/09 14:42
字数 600
阅读 4
收藏 0

volatile

使用volatile对属性字段做同步时,必须保证对该属性的操作是原子性的。如果有非原子性的操作,则volatile可能会无效。

Java并发编程:volatile关键字解析 http://www.cnblogs.com/dolphin0520/p/3920373.html 这一篇博客对volatile讲解的很详细,值得仔细阅读。

synchronized,wait,notify与notifyAll

synchronized可用在代码块和方法上。

class T{
	public synchronized static void method(){
		....
	}
}
或
class T{
	public void method(){
		synchronized(T.class){
			...
		}
	}
}
或
class T{
	private static byte[] lock = new byte[0];
	public void method(){
		synchronized(lock){
			...
		}
	}
}

如果是以上三种方式,则是对T这个类加锁,T类型的所有对象竞争的是同一个锁。

class T{
	public synchronized void method(){
		....
	}
}
或
class T{
	private byte[] lock = new byte[0];
	public void method(){
		synchronized(lock){
			...
		}
	}
}

如果是以上两种方式,则是对T类型的对象加锁,锁只对同一个对象有效。

更详细的讲解,请查看博客:Java中Synchronized的用法这篇博客。

wait()方法只能在synchronized内使用,调用此方法会让对象释放持有的锁,并加入等待池。notify()方法会从等待池任意唤醒一个对象,待执行完synchronized代码,这个被唤醒的对象便能够获取到锁。notityAll()方法会唤醒等待池中所有的对象,这些被唤醒的对象进入锁池竞争锁。

锁池:线程A获取到锁,紧接着来了B,C,D三个线程。因为A持有锁,所以B,C,D就进入这个锁的锁池,等待A释放锁。 等待池:进入synchronized代码中的线程A调用了wait()方法,则A释放锁进入该对象等待池,等待被唤醒。

更详细的内容请阅读博客 java中的锁池和等待池线程间协作:wait、notify、notifyAll

单例模式

双重检测:

public class T{
	private volatile static T instance;
	private T(){}

	public static T getInstance(){
		if(instance == null){
			synchronized(T.class){
				if(instance == null){
					instance = new T();
				}
			}
		}
		return instance;
	}
}

另一种更简洁的方式:

public class T{
	private static class Holder{
		static T instance = new T();
	}

	public static void getInstance(){
		return Holder.instance;
	}
}

参考了Java 中的双重检查(Double-Check)Initialization-on-demand holder idiom这两篇博客。

Lock

Java 并发开发:Lock 框架详解 http://www.cnblogs.com/aishangJava/p/6555291.html 这篇博客对Lock的知识讲解的非常详细,值得仔细阅读。

指令重排序

Java内存访问重排序的研究 https://tech.meituan.com/java-memory-reordering.html 如果有时间,可以细细阅读。

© 著作权归作者所有

哦_呢称
粉丝 1
博文 11
码字总数 13032
作品 0
私信 提问
【Java并发性和多线程】Java同步块

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/synchronized.html 译文链接:http://ifeve.com/synchronized-blocks/ Java 同步块(synchronized block)用来标记......

heroShane
2014/01/28
54
0
java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机
2018/05/16
0
0
浅谈Java中的ThreadLocal的多线程应用问题

什么是ThreadLocal?首先要说明的一点是ThreadLocal并不是一个Thread,而是Thread的局部变量。在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了...

小欣妹妹
2017/10/23
105
0
Java中ThreadLocal的设计与使用

ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更...

DragonRace
2013/11/25
350
0
Java Synchronized

Java Synchronized 1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对synchronized进行了各种优化之后,有些情况下它并不那么重了...

秋风醉了
2016/03/18
141
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部