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. A neural reinforcement learning model for tasks with unknown time delays

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 我们提出了一个基于生物学的神经模型,能够在复杂的任务中执行强化学习.该模型的独特之处在于,它能够在一个动作.状态转换和奖 ...

  2. iOS多线程之GCD、OperationQueue 对比和实践记录

    [toc] 简介      在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...

  3. MySQL集群搭建方案(PXC)

    服务器快过期了,清一点库存,把运维这块的知识复习下 为什么要搭MySQL集群 技术层面上,传统的单节点数据库,万一宕机了,就凉凉了.容灾性能差.抗并发能力有限,数据量大的时候查询有瓶颈.学习层面上,作 ...

  4. python文件操作、查看路径、查看文件名

    1 # -*- coding: utf-8 -* # from sys import argv # script,input_file = argv import os file_url = &quo ...

  5. Unity坑之 加了Rigidbody后主角反而朝天上飞?

    今儿在做项目的时候,给主角加上一个Rigidbody组件,设置如下图: 然后问题来了,我本来是想让主角通过重力控制,掉到地上,但是加上之后,主角反而朝着天上飞! 这TM什么鬼? 经过多番探查,发现是A ...

  6. github travis-ci持续部署hexo博客

    引言 目前我的博客源码是在coding上的,因为有很方便的持续部署,但是coding目前还不提供push文件的开放API. 因为最近做了一个一键分发平台,将博客分发到简书.CSDN等等的平台,但是我的 ...

  7. 软件架构与设计 百度网盘的pdf电子书籍

    如有版权问题请及时联系小编 软件架构与设计 百度网盘的pdf电子书籍 1:<软件体系结构(PDF)>https://pan.baidu.com/s/1lChfIJt5lc63KO09n5L ...

  8. 做一名合格的DBA

    Oracle DBA的角色定义 开发型DBA 数据库安装 数据库架构设计(架构和建模) 代码开发(存储过程,SQL) 运维型DBA 数据库日常监控 故障处理 性能优化 数据备份,容灾 数据库安全规划 ...

  9. 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!

      本文已经同步到微信公众号「极客起源」 . 现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面.移动.IOT.游戏.Web等平台的应用.这样对于开发人员是非常爽的.本文将介绍微软 ...

  10. 09 promise then

    then() 方法返回一个 Promise 链式调用:then里面回调函数(成功回调和失败回调),凡事这两个回调函数里面抛出错误或者返回一个已经是拒绝状态的 Promise. 那么 then 返回的  ...