JUC-多线程锁
多线程锁的练习题
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-多线程锁的更多相关文章
- JUC之多线程锁问题
多线程锁 8种问题锁状态: 该部分全部围绕的是以下内容并结合相应的例子:synchronized实现同步的基础:Java中每个对象都可以作为锁. 具体表现为以下三种形式:(之前只是简单的了解) 对于普 ...
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...
- 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发
本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- Java多线程--锁的优化
Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间 ...
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...
- JUC同步锁(五)
根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁". 一.同步锁--synchronized关键字 通过synchroniz ...
- juc多线程编程学习
JUC是java.util.concurrent的缩写,java.util.concurrent是在并发编程中使用的工具类. 在以前的解决并发问题,一般是通过Synchronize关键字,现在可以通过 ...
- Java——多线程锁的那些事
引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了 ...
随机推荐
- Everspin串口串行mram演示软件分析
Everspin在磁存储器设计,制造和交付给相关应用方面的知识和经验在半导体行业中是独一无二的.在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面处于市场领先地位.包括40nm,28nm ...
- java如何解决线程安全问题
方式一:同步代码块 synchroized(同步监视器的对象){需要被同步的代码} package threadtest; //使用同步代码块实现Runable接口的线程 public class R ...
- C语言 putchar
C语言 putchar putchar主要功能是输出一个char.可以根据ASLL号码输出对应字符 案例 #define _CRT_SECURE_NO_WARNINGS #include <st ...
- 一文看懂AI深度学习丨曼孚科技
深度学习(Deep Learning)是机器学习的一种,而机器学习是实现人工智能的必经途径. 目前大部分表现优异的AI应用都使用了深度学习技术,引领了第三次人工智能的浪潮. 一. 深度学习的概念 深度 ...
- 双向队列 SDUT 1466
题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作.现在给你一系列的操作,请输出最后队列的状态:命令格式:LIN X X表示一 ...
- hibernate.exception.GenericJDBCException: could not extract ResultSet 解决办法
这句话翻译过来就是无法提取ResultSet 我在联查表的视图的时候发现的问题,明明之前好好的 那么你就得想想了 你再把错误信息往上翻翻,能不能看到 no viable alternative a ...
- python3-cookbook笔记:第二章 字符串和文本
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
- shell awk学习3
需求: 某文件aa的内容如下: a/p1/p2b/pp1c/ppp1/ppp3d/p1/p2/p3e/p1/p2/p3/p4 期望输出结果: a /p1 /p2 b /pp1 c /ppp1 /ppp ...
- Linux系统下的CPU、内存、IO、网络的压力测试
本文转载自:小豆芽博客 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH ...
- Codeforces Round #578 (Div. 2) 二维差分 可做模板
题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...