java并发编程--Synchronized的理解
synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式。
(1)普通同步方法,锁是当前实例对象
(2)静态同步方法,锁是当前类的Class对象
(3)同步方法块,锁是Synchronized括号里配置的对象
首先看一下普通同步方法。
class Sync{
public synchronized void test(String threadname){
System.out.println(threadname+"开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(threadname+"结束");
}
}
class MyThread extends Thread{
public int i;
public MyThread(int i){
this.i=i;
}
public void run(){
Sync sync=new Sync();
sync.test("Thread"+i);
}
}
public class SynTest {
public static void main(String args[]){
for(int i=0;i<3;i++){
Thread thread=new MyThread(i);
thread.start();
}
}
}
运行结果。
Thread2开始
Thread0开始
Thread1开始
Thread2结束
Thread0结束
Thread1结束
虽然test()加了synchronized关键字,但是并没与起作用。这是因为,实例化了3个thread,synchronized加锁的是这3个实例化对象,并不是test()中的代码。需要注意的是,其他线程必须等到该线程释放实例对象之后才能使用该实例化对象。
然后看一下静态同步方法。修改上面的代码。将test()修改为静态的
public static synchronized void test(String threadname)
运行结果
Thread1开始
Thread1结束
Thread0开始
Thread0结束
Thread2开始
Thread2结束
这次synchronized关键字起作用了。这是因为静态同步方法的锁是当前类的Class对象,即Sync类的Class对象。当Thread1获取到该对象执行test()方法,Thread0只有等待Class对象释放之后才能使用。
最后是同步方法块,锁是取决于括号里的配置对象的。
public void test(String threadname){
synchronized(this){
System.out.println(threadname+"开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(threadname+"结束");
}
}
当使用的锁是this,因为我们是为每个线程新建了Sync类,所以它们是3个不同的this。结果如下
Thread0开始
Thread2开始
Thread1开始
Thread0结束
Thread1结束
Thread2结束
当使用Sync.Class对象作为锁时,synchronized的作用就看出来了。同一时刻只能有一个线程执行该段代码。
Thread0开始
Thread0结束
Thread1开始
Thread1结束
Thread2开始
Thread2结束
使用当前类的Class对象作为锁,就相当于对某段代码加了锁。
正在看并发~随手记下来~~参考的This http://blog.csdn.net/xiao__gui/article/details/8188833
java并发编程--Synchronized的理解的更多相关文章
- Java并发编程之深入理解线程池原理及实现
Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...
- 【Java并发编程之深入理解】Synchronized的使用
原文:https://blog.csdn.net/zjy15203167987/article/details/82531772 1.为什么要使用synchronized 在并发编程中存在线程安全问题 ...
- Java并发编程-synchronized指南
在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访 ...
- Java 并发编程学习笔记 理解CLH队列锁算法
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...
- Java并发编程-synchronized
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题.同步机制可以使用synchronized关键字实现.synchronized关 ...
- Java并发编程,深入理解ReentrantLock
ReentrantLock简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次 ...
- Java并发编程 | Synchronized原理与使用
Java提供了多种机制实现多线程之间有需要同步执行的场景需求.其中最基本的是Synchronized ,实现上使用对象监视器( Monitor ). Java中的每个对象都是与线程可以锁定或解锁的对象 ...
- Java并发编程:Synchronized及其实现原理
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
随机推荐
- 第2篇scrum
第2篇scrum 一.站立式会议 1.1会议照片 想得美 1.2项目进展 团队成员 昨日完成任务 今日计划任务 感想 吴茂平 完善用户系统 改进评论数据表,增加评论,删除评论,查询评论 今天也是元气满 ...
- phoenix PQS的kerberos相关配置
thin 客户端的实例代码 jdbc:phoenix:thin:url=<scheme>://<server-hostname>:<port>;authentica ...
- ent orm笔记1---快速尝鲜
前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用. 安装 ent orm 需 ...
- jmeter将上一个接口的返回值作为下一个接口的请求参数
接口响应结果,通常为HTML.Json格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,XPath提取. 对于Json格式响应结果,可以通过正则表达式.JSON Extractor插件.B ...
- 如何检查nofollow超链接属性是否有效
http://www.wocaoseo.com/thread-88-1-1.html nofollow 标签的重要性就不用阐述了,在这里武汉SEO与大家分享一些nofollow 标签的基本知识 ...
- Nodejs模块:path
当前版本:v 10.16.0 一,获取文件相关信息 1,path.basename(filepath[, ext]) 获取该文件的文件名,如果有扩展名,则一起显示扩展名: 如果不想展示扩展名,只想展示 ...
- 启用和禁用warning
#pragma warning 启用和禁用warning https://www.cnblogs.com/Free-Thinker/p/5897678.html
- ACwing 你能回答这些问题吗(线段树求最大连续字段和)
给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...
- SpringCloud入门 消息总线 Bus
消息总线 1.概述 使用SpringCloud Bus配和Spring Cloud Config使用实现配置的动态刷新 Bus只支持消息处理:RabbitMQ和Kafaka. 能干嘛 能管理和传播分布 ...
- 跟着兄弟连系统学习Linux-【day03】
day03-20200529 p10.学习注意事项 linux严格区分大小写(与python有点像) Linux中所有内容都是通过文件形式保存,通过命令执行设置参数,写 ...