多线程锁的练习题

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. JS DOM属性,包括固有属性和自定义属性,以及属性获取、移除和设置

    属性分为固有属性property和自定义属性attribute 固有属性查看 固有属性可以通过ele.property 来获取,自定义属性不行 <!DOCTYPE html> <ht ...

  2. 应用场景不同,是无代码和低代码的最大区别 ZT

    随着媒体对低代码.无代码等先进技术的持续关注,我们发现大多数人都听说过低代码开发和无代码开发这两个概念,但是对两者之间的区别其实并不清楚.事实上,低代码开发和无代码开发之间存在着很多非常显著的差异,如 ...

  3. gRPC搭建使用方式

    gRpc 官网  链接 新建服务端项目 在服务端内先编写一个 .proto 文件 greet.proto syntax = "proto3"; service Greeter { ...

  4. Android实战项目——家庭记账本(四)

    今天是开发的第四天,完成的主要内容如下: 1.账单查询功能的完善以及查询结果的显示和编辑 2.侧边栏布局的实现 3.首页fragment中本月与上月对比账目情况 实现的效果如图: 已添加的账单内容以及 ...

  5. matplotlib制作图表数据

    import matplotlib.pyplot as plt import matplotlib fig=plt.figure() labels=['陆地','海洋'] data=[29,71] p ...

  6. LeetCode 144. 二叉树的前序遍历 (非递归)

    题目链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 给定一个二叉树,返回它的 前序 遍历. /** * Defi ...

  7. win7安装SQL Server 2005 的问题总结

    SQL Server 安装程序无法连接到数据库服务进行服务器配置. 错误为: [Microsoft][SQL Native Client]客户端不支持加密. 有关详细信息,请参阅服务器错误日志和安装日 ...

  8. 转: Laravel的数据库迁移 介绍的比较清晰

    原文: https://blog.sbot.io/articles/12/Laravel-数据库迁移(Database-Migrations)操作实例 很多人可能在学习Laravel框架的时候,对La ...

  9. JS实现登录页密码的显示和隐藏功能

    在登录页经常会用到通过点击文本框的类似小眼睛图片来实现隐藏显示密码的功能,其实实现原理很简单,通过点击事件来改变input的type类型,具体过程看代码: 在没给大家分享实现代码之前,先给大家展示下效 ...

  10. 【pattern】设计模式(1) - 单例模式

    前言 好久没写博客,强迫自己写一篇.只是总结一下自己学习的单例模式. 说明 单例模式的定义,摘自baike: 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):“保证一个类 ...