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的理解的更多相关文章

  1. Java并发编程之深入理解线程池原理及实现

    Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...

  2. 【Java并发编程之深入理解】Synchronized的使用

    原文:https://blog.csdn.net/zjy15203167987/article/details/82531772 1.为什么要使用synchronized 在并发编程中存在线程安全问题 ...

  3. Java并发编程-synchronized指南

    在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访 ...

  4. Java 并发编程学习笔记 理解CLH队列锁算法

    CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...

  5. Java并发编程-synchronized

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题.同步机制可以使用synchronized关键字实现.synchronized关 ...

  6. Java并发编程,深入理解ReentrantLock

    ReentrantLock简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次 ...

  7. Java并发编程 | Synchronized原理与使用

    Java提供了多种机制实现多线程之间有需要同步执行的场景需求.其中最基本的是Synchronized ,实现上使用对象监视器( Monitor ). Java中的每个对象都是与线程可以锁定或解锁的对象 ...

  8. Java并发编程:Synchronized及其实现原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  9. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

随机推荐

  1. 第2篇scrum

    第2篇scrum 一.站立式会议 1.1会议照片 想得美 1.2项目进展 团队成员 昨日完成任务 今日计划任务 感想 吴茂平 完善用户系统 改进评论数据表,增加评论,删除评论,查询评论 今天也是元气满 ...

  2. phoenix PQS的kerberos相关配置

    thin 客户端的实例代码 jdbc:phoenix:thin:url=<scheme>://<server-hostname>:<port>;authentica ...

  3. ent orm笔记1---快速尝鲜

    前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用. 安装 ent orm 需 ...

  4. jmeter将上一个接口的返回值作为下一个接口的请求参数

    接口响应结果,通常为HTML.Json格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,XPath提取. 对于Json格式响应结果,可以通过正则表达式.JSON Extractor插件.B ...

  5. 如何检查nofollow超链接属性是否有效

    http://www.wocaoseo.com/thread-88-1-1.html     nofollow 标签的重要性就不用阐述了,在这里武汉SEO与大家分享一些nofollow 标签的基本知识 ...

  6. Nodejs模块:path

    当前版本:v 10.16.0 一,获取文件相关信息 1,path.basename(filepath[, ext]) 获取该文件的文件名,如果有扩展名,则一起显示扩展名: 如果不想展示扩展名,只想展示 ...

  7. 启用和禁用warning

    #pragma warning 启用和禁用warning https://www.cnblogs.com/Free-Thinker/p/5897678.html

  8. ACwing 你能回答这些问题吗(线段树求最大连续字段和)

    给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...

  9. SpringCloud入门 消息总线 Bus

    消息总线 1.概述 使用SpringCloud Bus配和Spring Cloud Config使用实现配置的动态刷新 Bus只支持消息处理:RabbitMQ和Kafaka. 能干嘛 能管理和传播分布 ...

  10. 跟着兄弟连系统学习Linux-【day03】

    day03-20200529 p10.学习注意事项         linux严格区分大小写(与python有点像)         Linux中所有内容都是通过文件形式保存,通过命令执行设置参数,写 ...