Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Synchronized介绍

Synchronized介绍

原创
作者头像
HLee
修改于 2021-11-04 01:58:21
修改于 2021-11-04 01:58:21
42500
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

简介

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 

  • 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 
  • 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 
  • 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 
  • 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
synchronized和lock区别:
1.synchronized是一个内置的java关键字;lock是一个java类
2.synchronized无法判断锁状态;lock可以判断锁状态;
3.synchronized会自动释放锁;lock必须手动释放锁;
4.synchronized获取锁(线程A获得锁,阻塞其他线程;线程B被阻塞,一直傻傻等);lock就不一定会傻傻等;
5.synchronized是可重入锁,不可中断的锁,非公平锁;lock是可重入锁 非公平(可以自己设置);
6.synchronized适合少量的代码同步问题;lock适合大量的同步代码;

实例代码

描述:标准情况下,两个线程谁先打印。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo {

    public static void main(String[] args) throws Exception{

        Phone phone = new Phone();
        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone.call();
        }, "A").start();
    }
}
class  Phone {

    // synchronized锁的对象是方法的调用者 谁先拿到,谁先执行
    public synchronized void sendSms() {
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}
发短信
打电话

描述:sendSms延迟4秒,两个线程谁先打印。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo {

    public static void main(String[] args) throws Exception{

        Phone phone = new Phone();
        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone.call();
        }, "A").start();
    }
}
class  Phone {

    // synchronized锁的对象是方法的调用者 谁先拿到,谁先执行
    public synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}

发短信
打电话

描述:新增一个普通方法hello

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo3 {
    public static void main(String[] args) throws Exception{

        Phone3 phone = new Phone3();
        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone.hello();
        }, "A").start();
    }
}
class Phone3 {

    // synchronized锁的对象是方法的调用者 谁先拿到,谁先执行
    public synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }

    public void hello() {
        System.out.println("你好呀");
    }
}
你好呀
发短信

描述:两个对象调用两个同步方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo4 {
    public static void main(String[] args) throws Exception{

        // 两个对象
        Phone4 phone = new Phone4();
        Phone4 phone2 = new Phone4();

        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone2.call();
        }, "A").start();
    }
}

class Phone4 {

    // synchronized锁的对象是方法的调用者 谁先拿到,谁先执行
    public synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}
打电话
发短信

描述:增加两个静态的同步方法,在一个对象和两个对象的前提下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo5 {
    public static void main(String[] args) throws Exception{

        Phone5 phone = new Phone5();

        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone.call();
        }, "A").start();
    }
}

class Phone5 {

    // static静态方法,属于类的,所以锁的是类Class
    public static synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public static synchronized void call() {
        System.out.println("打电话");
    }
}
发短信
打电话

public class ThreadDemo5 {
    public static void main(String[] args) throws Exception{

        Phone5 phone = new Phone5();
        Phone5 phone2 = new Phone5();

        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone2.call();
        }, "A").start();
    }
}

class Phone5 {

    // static静态方法,属于类的,所以锁的是类Class
    public static synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // static静态方法,属于类的,所以锁的是类Class
    public static synchronized void call() {
        System.out.println("打电话");
    }
}
发短信
打电话

描述:一个静态同步方法,一个普通同步方法;在一个对象和两个对象的前提下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadDemo6 {
    public static void main(String[] args) throws Exception{

        Phone6 phone = new Phone6();

        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone.call();
        }, "A").start();
    }
}

class Phone6 {

    // static静态方法,属于类的,所以锁的是类Class
    public static synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}
打电话
发短信

public class ThreadDemo6 {
    public static void main(String[] args) throws Exception{

        Phone6 phone = new Phone6();
        Phone6 phone2 = new Phone6();

        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        TimeUnit.SECONDS.sleep(2);

        new Thread(() -> {
            phone2.call();
        }, "A").start();
    }
}

class Phone6 {

    // static静态方法,属于类的,所以锁的是类Class
    public static synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // synchronized锁的对象是方法的调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}
打电话
发短信

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java锁:第一章:公平和非公平锁
更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120323146
马克社区
2022/08/22
2410
多线程二 synchronized的使用
它的机制是手动加锁,自动释放锁。下面看一个例子,在异常的地方一定要处理异常,不然就会想下面代码中的线程1,会被释放掉。
用针戳左手中指指头
2021/01/29
2830
多线程二 synchronized的使用
【JUC】002-8锁现象
(问题回顾:什么是锁?到底锁的谁?要么锁new出来的对象,要么是Class,下面详解)
訾博ZiBo
2025/01/06
360
JUC系列(二)八个有关锁的问题,让你吃透各种场景
答:会 两个不同的对象锁也是不同的 ,对象1 还在等待,对象2调用的call方法不用等待所以先输出
冷环渊
2022/11/02
3140
【JAVA】萌新必入!手把手教你玩转 Synchronized 锁和 Lock 锁!
这是一篇关于 Synchronized 锁和 Lock 锁的超详细的万字博文,博文中列举了大量的例子用于理解,相信深度阅读本博文后,玩转 Synchronized 锁和 Lock 锁轻轻松松,有手就行!  
sidiot
2023/08/31
9280
【JAVA】萌新必入!手把手教你玩转 Synchronized 锁和 Lock 锁!
死磕juc(二)java的“锁”事(1)
ObjectMonitor.java→ObjectMonitor.cpp→objectMonitor.hpp
yuanshuai
2022/08/17
3580
死磕juc(二)java的“锁”事(1)
3. Java中的锁
cheese
2024/02/27
1400
3. Java中的锁
8锁问题
8锁问题 场景一 标准情况访问:两个同步方法,一个对象调用 import java.util.concurrent.TimeUnit; /** * 标准情况下 是先sendEmail() 还是先c
西柚dzh
2022/06/09
2250
【JUC基础】03. 几段代码看懂synchronized
程序员经常听到“并发锁”这个名词,而且实际项目中也确实避免不了要加锁。那么什么是锁?锁的是什么?今天文章从8个有意思的案例,彻底弄清这两个问题。
有一只柴犬
2024/01/25
930
【JUC基础】03. 几段代码看懂synchronized
java---多线程[(重点)上]
以前写的程序都是单线程,main方法程序称为主线程,主线程的结束所有的子线程都会跟着结束。多线程就代表着一个程序可以去做多件事情。
用户10787181
2023/10/17
3030
java---多线程[(重点)上]
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
公平锁: 是指多个线程按照申请锁的顺序来获取锁。 非公平锁: 是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。饥饿现象就是低优先级的线程可能一直拿不到锁,而一直处于等待状态。
程序猿川子
2024/11/11
3110
JUC系列(九) CAS 与锁的理解
CAS:比较当前工作内存中的值,如果这个值是期望的,那么执行操作,如果不是就一直循环
冷环渊
2022/12/03
2910
JUC系列(九) CAS 与锁的理解
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
https://blog.csdn.net/qq_29689343/article/details/105046493
訾博ZiBo
2025/01/06
1010
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
JUC从实战到源码:让你瞬间秒懂什么是锁
在之前的文章中,我们已经学到了关于Future以及演变到CompletableFuture的应用,接下来就是我们日常中接触最多的内容:多线程与并发,尽管之前笔者也发布过几篇文章,在CSDN的阅读量也都突破了20w+【多线程与高并发】- synchronized锁的认知,可见是大多数开发者都在关注的点。今天这篇文章属于JUC系列,然而也涉及到多线程与锁的知识,这章就再次来学习一下。
怒放吧德德
2024/09/23
1140
JUC并发编程
业务:普通的线程代码 Thread Runnable: 没有返回值、效率比Callable 相对较低!
JokerDJ
2023/11/27
3000
JUC并发编程
话说 synchronized
有时候会看见synchronized(this) 这是什么锁 ? this嘛 就是指当前对象,也是对象锁,
木子的昼夜
2021/03/02
5190
话说 synchronized
java锁:第二章:可重入锁和递归锁
可重入锁是什么? 可以防止死锁,是同一把锁 代码: package com.javaliao.backstage; class Phone{ public synchronized voi
Java廖志伟
2021/01/29
5420
并发编程中的金光咒-锁(基础版)
大家好,我是小高先生。在Java并发编程的世界中,锁的地位至关重要。它就像是一道坚固的防线,确保了并发编程运行结果的正确性。你可以不准备攻击装备,但是锁这个防御装备是必不可少的。相信大家在之前都对锁或多或少有些了解,本文将带领大家学习锁的基础知识。
小高先生
2024/02/17
1440
详解synchronized锁的各种用法及注意事项
本文主要通过简单的demo来阐述synchronized锁的各种用法以及使用synchronized锁的相关注意事项,记录下来同时也方便自己记忆。
用户4172423
2021/04/02
4840
JUC学习之8锁现象
总结:synchronized锁的是方法的调用者,这里就是people1,不同的对象对应不同的锁
Java那些事儿
2020/07/21
6670
相关推荐
java锁:第一章:公平和非公平锁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验