多线程锁的练习题

1、标准访问,先打印短信还是邮件

class  Phone {
public synchronized void sendSMS() throws Exception
{
Thread.sleep(400);题【2】添加延时
System. out .println( "------sendSMS" );
} public synchronized void sendEmail() throws Exception
{
System. out .println( "------sendEmail" );
}
public void getHello()
{
System. out .println( "------getHello" );
} }
public class MoreThreadLock {
public static void main(String[] args ) throws Exception
{
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try { phone .sendSMS(); } catch (Exception e ) { e .printStackTrace(); } }, "AA" ).start(); Thread. sleep (100); new Thread(() -> { try { phone .sendEmail(); //phone.getHello(); //phone2.sendEmail(); } catch (Exception e ) { e .printStackTrace(); } }, "BB" ).start(); }
}

------sendSMS
------sendEmail

2、停4秒在短信方法内,先打印短信还是邮件

  ------sendSMS
  ------sendEmail

3、普通的hello方法,是先打短信还是hello ,

hello方法是普通方法,短信进程需要四秒

public class MoreThreadLock {
public static void main(String[] args ) throws Exception
{
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try { phone .sendSMS(); } catch (Exception e ) { e .printStackTrace(); } }, "AA" ).start(); Thread. sleep (100);//主线程睡1秒,为了区分谁先执行 new Thread(() -> { try { phone.getHello(); //phone2.sendEmail(); } catch (Exception e ) { e .printStackTrace(); } }, "BB" ).start(); }
}

4、现在有两部手机,先打印短信还是邮件

public class MoreThreadLock {
public static void main(String[] args ) throws Exception
{
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try { phone .sendSMS(); } catch (Exception e ) { e .printStackTrace(); } }, "AA" ).start(); Thread. sleep (100);
new Thread(() -> { try { phone2.sendEmail(); } catch (Exception e ) { e .printStackTrace(); } }, "BB" ).start(); }
}

------sendEmail
------sendSMS

5、 两个静态同步方法,1部手机,先打印短信还是邮件

class  Phone {
public static synchronized void sendSMS() throws Exception
{
Thread.sleep(400);题【2】添加延时
System. out .println( "------sendSMS" );
} public static synchronized void sendEmail() throws Exception
{
System. out .println( "------sendEmail" );
} }

------sendSMS
------sendEmail

6、两个静态同步方法,2部手机,先打印短信还是邮件

public class MoreThreadLock {
public static void main(String[] args ) throws Exception
{
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try { phone .sendSMS(); } catch (Exception e ) { e .printStackTrace(); } }, "AA" ).start(); Thread. sleep (100);//主线程睡1秒,为了区分谁先执行 new Thread(() -> { try { phone2.sendEmail(); } catch (Exception e ) { e .printStackTrace(); } }, "BB" ).start(); }
}
4、现在有两部手机,先打印短信还是邮件 public class MoreThreadLock {
public static void main(String[] args ) throws Exception
{
Phone phone = new Phone();
Phone phone2 = new Phone();
new Thread(() -> {
try { phone .sendSMS(); } catch (Exception e ) { e .printStackTrace(); } }, "AA" ).start(); Thread. sleep (100); new Thread(() -> { try { phone2.sendEmail(); } catch (Exception e ) { e .printStackTrace(); } }, "BB" ).start(); }
}

------sendSMS
------sendEmail

7、1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件

class  Phone {
public static synchronized void sendSMS() throws Exception
{
Thread.sleep(400);题【2】添加延时
System. out .println( "------sendSMS" );
} public synchronized void sendEmail() throws Exception
{
System. out .println( "------sendEmail" );
} }

------sendEmail
------sendSMS

8、1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件

class  Phone {
public static synchronized void sendSMS() throws Exception
{
Thread.sleep(400);题【2】添加延时
System. out .println( "------sendSMS" );
} public synchronized void sendEmail() throws Exception
{
System. out .println( "------sendEmail" );
} }

------sendEmail
------sendSMS

总结:

A 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,

其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法

锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法

加个普通方法后发现和同步锁无关

换成两个对象后,不是同一把锁了,情况立刻变化。

synchronized实现同步的基础:Java中的每一个对象都可以作为锁。

具体表现为以下3种形式。

对于普通同步方法,锁是当前实例对象。

对于静态同步方法,锁是当前类的Class对象。

对于同步方法块,锁是 Synchonized 括号里配置的对象

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。

也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,

可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,

所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

所有的静态同步方法用的也是同一把锁——类对象本身,

这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。

但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,

而不管是同一个实例对象的静态同步方法之间,

还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

JUC-多线程锁的更多相关文章

  1. JUC之多线程锁问题

    多线程锁 8种问题锁状态: 该部分全部围绕的是以下内容并结合相应的例子:synchronized实现同步的基础:Java中每个对象都可以作为锁. 具体表现为以下三种形式:(之前只是简单的了解) 对于普 ...

  2. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  3. 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发

    本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...

  4. Python多线程锁

    [Python之旅]第六篇(四):Python多线程锁   python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...

  5. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  6. Java多线程--锁的优化

    Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间 ...

  7. synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

    本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...

  8. JUC同步锁(五)

    根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 一.同步锁--synchronized关键字 通过synchroniz ...

  9. juc多线程编程学习

    JUC是java.util.concurrent的缩写,java.util.concurrent是在并发编程中使用的工具类. 在以前的解决并发问题,一般是通过Synchronize关键字,现在可以通过 ...

  10. Java——多线程锁的那些事

    引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了 ...

随机推荐

  1. 大二网课ing学习周记

    行稳致远,久久为功! 一个概念套着一个概念哦!码就是关键字,标识属性是也! 1.什么是主码和外码,请举例说明. 关键字也叫码! 首先,在一个关系中,能惟一标识元组的属性or最小属性集称为关系的候选码. ...

  2. 【一起刷LeetCode】整数反转

    前言&絮叨 别人都忙着参加年会晒奖品,我却忙着写代码.每逢年底都要安排几个紧急项目,我什么时候能摆脱这种宿命. 在忙也不能忘记刷LeetCode,毛毛向前冲!!! 题目描述 给出一个 32 位 ...

  3. Git 尝试

    1,下载Git 2,安装GIt 3,config : git config --global user.name "mxb" git config --global user.em ...

  4. 数据结构(集合)学习之List

    集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于List<E>的简单学习总结. 补充:HashTable父类是Dictionary,不 ...

  5. CodingPlus Blog Update Info

    CodingPlus更新啦! 我就是记录一下!您想知道现在的博客是第几代的吗?您想知道CodingPlus博客的发展历程吗?来,让我们一起看看! V3.5 最新版了! V3.5.0 很多人看到自然觉得 ...

  6. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

    Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时 ...

  7. sublime—text终端无法输入,不支持scanf、input等语法问题的解决

    sublimetext是个很好用的轻量编辑器,,支持多语言语法高亮,自动补全,快捷键编译运行,而且ui也不错挺简洁,我一直在用.我之前浏览帖子时候看到有些人也在用这个编辑器. 但是吧,这个编辑器的的编 ...

  8. c#枚举转字典或表格

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) (找最值)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  10. 记PHP使用rtrim()导致获得的数据乱码问题

    一.问题描述: 我用rtrim()函数去除右侧多余的"."号,去除之后,发现乱码. 二.出现原因: 当右侧没有分号,要去除的字符串的十六进制又刚刚好以81结尾,就导致81被去除,从 ...