synchronized官方定义:

同步方法支持一种简单的策略防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的(这一个synchronized关键字完成的)。

通俗的来讲:

synchronized关键字:能够保证同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。

synchronized的两个用法:

1.对象锁:包括方法锁(默认锁对象是当前实例对象)和同步代码块锁(自己指定锁的对象);

2.类锁:synchronized修饰的静态的方法或指定锁为Class对象;

代码展示:

对象锁:针对的是同一个对象(即下列中的instance对象),如果是两个不同的对象,对象锁就不能起到同步的作用(可以自己创两个对象测试),而类锁可以。

 * 对象锁的代码块形式
* @author Administrator
*
*/
public class SynchronizeTest01 implements Runnable{
static SynchronizeTest01 instance = new SynchronizeTest01();
    Object obj = new Object();
@Override
public void run() {
      //锁自定义对象
      synchronized (obj) {
            System.out.println("我是对象锁代码块,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"玩完了");
}
      //第一种锁当前对象
/*synchronized (this) {
System.out.println("我是对象锁代码块,我叫"+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"玩完了");
}*/
}
public static void main(String[] args) {
Thread t1 = new Thread(instance,"线程一");
Thread t2 = new Thread(instance,"线程二");
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) { }
System.out.println("执行结束");
}
}

/**
* 普通方法锁形式
* @author Administrator
*
*/
public class SynchronizeTest02 implements Runnable{
static SynchronizeTest02 instance = new SynchronizeTest02();
@Override
public void run() {
//调用加synchronized关键字的普通方法
method();
}
public synchronized void method() {
System.out.println("我是普通方法锁,我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "玩完了");
}
public static void main(String[] args) {
Thread t1 = new Thread(instance,"线程一");
Thread t2 = new Thread(instance,"线程二");
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) { }
System.out.println("执行结束");
}
}

普通方法锁形式

类锁:每个类可能会有多个对象,但是每个类只有一个Class对象,所以类锁的本质就是对Class对象的锁,类锁在同一时刻只能被一个对象拥有(对象锁不可以)

类锁的第一种形式:在静态方法上加锁,并创建了两个对象,依然可以解决并发问题。

/**
*
* 类锁的第一种形式:静态方法锁形式
* @author Administrator
*
*/
public class SynchronizeTest02 implements Runnable{
static SynchronizeTest02 instance1 = new SynchronizeTest02();
static SynchronizeTest02 instance2 = new SynchronizeTest02();
@Override
public void run() {
//调用加synchronized关键字的静态方法
method();
}
public static synchronized void method() {
System.out.println("我是静态方法锁,我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "玩完了");
}
public static void main(String[] args) {
Thread t1 = new Thread(instance1,"线程一");
Thread t2 = new Thread(instance2,"线程二");
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) { }
System.out.println("执行结束");
}
}

类锁的第二种形式:

/**
*
* 类锁的第二种形式:代码块锁.Class形式
* @author Administrator
*
*/
public class SynchronizeTest03 implements Runnable{
static SynchronizeTest03 instance1 = new SynchronizeTest03();
static SynchronizeTest03 instance2 = new SynchronizeTest03();
@Override
public void run() {
//调用加synchronized关键字的普通方法
method();
}
public void method() {
synchronized (SynchronizeTest03.class) {
System.out.println("我是静态方法锁,我叫" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "玩完了");
}
}
public static void main(String[] args) {
Thread t1 = new Thread(instance1,"线程一");
Thread t2 = new Thread(instance1,"线程二");
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) { }
System.out.println("执行结束");
}
}

锁代码块中锁.Class形式

synchronized关键字详解(一)的更多相关文章

  1. Java多线程(三)—— synchronized关键字详解

    一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...

  2. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java synchronized 关键字详解

    Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...

  4. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

  5. Java 多线程(六) synchronized关键字详解

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

  6. [java] java synchronized 关键字详解

    Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一 ...

  7. 简单的互斥同步方式——synchronized关键字详解

    目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...

  8. synchronized关键字详解(二)

    synchronized关键字的性质 1.可重入:同一线程的外层函数获得锁之后,内层函数可直接再次获得该锁,好处:避免死锁,提升封装性 证明可重入粒度:1.同一个方法是可重入的 2.可重入不要求是同一 ...

  9. java关键字(详解)

    目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...

随机推荐

  1. js 防止重复提交表单

    var addFlag = true; function addQuestion(){ if(!addFlag){ return; } addFlag = false; //执行更新操作 jQuery ...

  2. NYOJ 832 合并游戏

    合并游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 大家都知道Yougth除了热爱编程之外,他还有一个爱好就是喜欢玩.某天在河边玩耍的时候,他发现了一种神奇的石 ...

  3. Python学习笔记 (2)变量、常量和数据类型

    变量 顾名思义,变量就是一个会变的量,用一个变量名表示,指向内存中一片区域,而指向的区域存的是什么,这个变量就是什么数据类型,和C/C++挺不一样的.变量数据类型可以通过赋值变来变去(这就叫动态语言, ...

  4. 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    1267 老鼠的旅行  2012年CCC加拿大高中生信息学奥赛 题目描述 Description You are a mouse that lives in a cage in a large lab ...

  5. ajax多文件上传,js原生ajax请求(转)

    function uploadImageFile(){ var xhr = new XMLHttpRequest(); //定义表单变量 var file = document.getElementB ...

  6. VS2017 +NetCore2.2.0+WebApi项目整合SwaggerUI 以及遇到的坑

    1.新建一个WebApi项目,这里不说了. 2.打开项目nuget管理控制台,在 https://www.nuget.org/ 搜索swagger的包:Swashbuckle.AspNetCore , ...

  7. 【解决】hive与hbase表结合级联查询的问题

    [Author]: kwu [解决]hive与hbase表结合级联查询的问题.hive两个表以上,关联查询时出现长时无法返回的情况. 同一时候也不出现,mr的进度百分比. 查询日志如图所看到的: 解决 ...

  8. ios7新增api实现扫描二维码

    本来用的ZBar开源库实现的扫描二维码,可是貌似不支持arm64了,也没有在更新. 如今不用适配ios7下面.而iOS新增系统API已支持扫码,參考老外的一篇博客做了个demo.须要的能够參考下 參考 ...

  9. 【翻译自mos文章】rman 标准版和企业版的兼容性

    rman 标准版和企业版的兼容性 来源于: RMAN Standard and Enterprise Edition Compatibility (文档 ID 730193.1) 适用于: Oracl ...

  10. DB9针型:RS485输出信号及接线端子引脚分配

    下图所看到的.DB9针型RS485输出信号及接线端子引脚分配. 此DB9针型与 标准 RS232 or RS485 DB9定义有所不同,下图中的DB9针型说明仅是针对USB转485DB9接口. wat ...