Java多线程中的互斥锁解析
更新时间:2023年09月15日 11:06:07 作者:伊颦伊笑
这篇文章主要介绍了Java多线程中的互斥锁解析,Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性,每个对象都对应于一个可称为互斥锁的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象,需要的朋友可以参考下
基本介绍
- Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
- 每个对象都对应于一个可称为 “ 互斥锁 ” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
- 关键字 synchronized 来与对象的互斥锁联系。当某个对象用 synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问
- 同步的局限性:导致程序的执行效率要降低
- 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)
- 同步方法(静态的)的锁为当前类本身。
把 synchronized 写在代码块上
package thread_; /** * @Author: Gin * @Description: * @Modified By: Gin * @Date: Created in 16:37 2021/9/27 */ public class Thread11 { public static void main(String[] args) { SellThread04 sellThread04 = new SellThread04(); new Thread(sellThread04).start(); new Thread(sellThread04).start(); new Thread(sellThread04).start(); } } class SellThread04 implements Runnable{ private int ticketsNum = 100; private boolean flag = true; @Override public void run() { while (flag) { sell(); } } /* 1. public synchronized void sell(){} 就是一个同步方法 2. 这时“锁”在 this 对象上 3. 也可以在代码块上写 synchronized,同步代码块,互斥锁还是在 this 对象上 如下: */ public /* synchronized */ void sell(){ synchronized (this) { if(ticketsNum <= 0){ System.out.println("售票结束..."); flag = false; return; } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一张, 剩余票数 " + (--ticketsNum)); } } }
测试操作同一个对象、静态方法的锁的添加
package thread_; /** * @Author: Gin * @Description: * @Modified By: Gin * @Date: Created in 16:37 2021/9/27 */ public class Thread11 { public static void main(String[] args) { SellThread04 sellThread04 = new SellThread04(); new Thread(sellThread04).start(); new Thread(sellThread04).start(); new Thread(sellThread04).start(); } } class SellThread04 implements Runnable{ private int ticketsNum = 100; private boolean flag = true; // 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象) // new 一个 Object 对象,测试操作同一个对象 Object object = new Object(); // 同步方法(静态的)的锁为当前类本身。 public synchronized static void m1(){ System.out.println("m1"); } // 在静态方法中实现一个同步代码块 public static void m2(){ synchronized (SellThread04.class) { System.out.println("m2"); } } @Override public void run() { while (flag) { sell(); } } /* 1. public synchronized void sell(){} 就是一个同步方法 2. 这时“锁”在 this 对象上 3. 也可以在代码块上写 synchronized,同步代码块,互斥锁还是在 this 对象上 如下: */ public /* synchronized */ void sell(){ synchronized ( /*this*/ object ) { // 测试操作同一个对象 if(ticketsNum <= 0){ System.out.println("售票结束..."); flag = false; return; } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一张, 剩余票数 " + (--ticketsNum)); } } }
细节
同步方法如果没有使用 static 修饰:默认锁对象为 this如果方法使用 static 修饰,默认锁对象:当前类.class
到此这篇关于Java多线程中的互斥锁解析的文章就介绍到这了,更多相关Java互斥锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MyBatis异常-Property ''configLocation'' not specified, using d
今天小编就为大家分享一篇关于MyBatis异常-Property 'configLocation' not specified, using default MyBatis Configuration,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03MyBatis-plus使用lambda条件构造器报错问题及解决
这篇文章主要介绍了MyBatis-plus使用lambda条件构造器报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01lombok注解@Data使用在继承类上时出现警告的问题及解决
Lombok的@Data注解简化了实体类代码,但在子类中使用时会出现警告,指出equals和hashCode方法不会考虑父类属性,解决方法有两种:一是在父类上使用@EqualsAndHashCode(callSuper=true)注解;二是通过配置lombok.config文件,均能有效解决警告问题2024-10-10
最新评论