当前位置: 首页 > news >正文

德州市建设街小学网站首页wordpress的文章多重筛选

德州市建设街小学网站首页,wordpress的文章多重筛选,企业查询软件,2024年重大新闻简短目录 synchronized的使用方法 1.最常见的是synchronized 修饰代码块,并指定锁对象。 2.当 synchronized 修饰实例方法时,锁对象是当前实例(this) 3.当 synchronized 修饰静态方法时,锁对象是当前类的 Class类对象。…

目录

synchronized的使用方法

1.最常见的是synchronized 修饰代码块,并指定锁对象。 

2.当 synchronized 修饰实例方法时,锁对象是当前实例(this)

3.当 synchronized 修饰静态方法时,锁对象是当前类的 Class类对象。对于一个类来说,只有一个唯一的calss类对象。

synchronized 的特性

互斥性

锁的可重入性 

死锁的情况

如何避免死锁

​编辑


上节课的时候我们讨论了多线程安全问题,讲到了关键字——synchronized,我们讲了其中的一种synchronized的使用方法,这节课我们先来学习它的其他用法

synchronized的使用方法

1.最常见的是synchronized 修饰代码块,并指定锁对象。 

package thread;import java.util.Vector;class Counter {public int count = 0;public void add() {count++;}}public class Demo16 {public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Thread t1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {synchronized (counter) {counter.add();}}});Thread t2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {synchronized (counter) {counter.add();}}});t1.start();t2.start();t1.join();t2.join();System.out.println("counter=" + counter.count);}
}

2.当 synchronized 修饰实例方法时,锁对象是当前实例(this

public class Counter {private int count = 0;public synchronized void increment() {count++;}//该代码约等于如下代码public  void increment() {synchronized(this){count++;}
}public int getCount() {return count;}
}
  • 多个线程调用同一个 Counter 实例的 increment() 方法时,同一时间只有一个线程能够执行该方法。

  • 锁对象是当前实例(this)。

3.当 synchronized 修饰静态方法时,锁对象是当前类的 Class类对象。对于一个类来说,只有一个唯一的calss类对象。

public class Counter {private int count = 0;public static synchronized void increment() {count++;}//该代码约等于如下代码public static void increment() {synchronized(Counter.class){count++;}
}public int getCount() {return count;}
}

synchronized 的特性

互斥性
  • synchronized 确保同一时间只有一个线程能够执行被保护的代码块或方法。

  • 其他线程必须等待当前线程释放锁后才能获取锁并执行代码。

锁的可重入性 
static class Counter {public int count = 0;synchronized void increase() {count++;}synchronized void increase2() {increase();}
}

如果用该代码,按照之前对于锁的设定, 第二次加锁的时候, 该线程就会阻塞等待. 直到第一次的锁被释放, 才能获取到第二个锁. 但是释放第一个锁也是由该线程来完成, 结果这个线程已经堵塞了, 也就无法进行解锁操作. 这时候就会 死锁.
这样的锁称为 不可重入锁.

那么可重入锁就是
• 一个对象可以多次在同一个线程内连续加锁,而不会导致死锁。
• 在同一个线程连续加锁时,每次加锁,锁的计数器加 1;每次释放锁时,计数器减 1。只有当计数器为 0 时,锁才会被完全释放。

死锁的情况

 虽然在synchronized中连续加锁不会出现死锁,但还有其他很多情况会出现死锁,

 比如嵌套锁导致的死锁

package thread;public class Demo17 {private static Object locker1 = new Object();private static Object locker2 = new Object();public static void main(String[] args) {Thread t1 = new Thread(() -> {synchronized (locker1) {System.out.println("t1 加锁 locker1 完成");// 这里的 sleep 是为了确保, t1 和 t2 都先分别拿到 locker1 和 locker2 然后在分别拿对方的锁.// 如果没有 sleep 执行顺序就不可控, 可能出现某个线程一口气拿到两把锁, 另一个线程还没执行呢, 无法构造出死锁.try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker2) {System.out.println("t1 加锁 locker2 完成");}}});Thread t2 = new Thread(() -> {synchronized (locker1) {System.out.println("t2 加锁 locker1 完成");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker2) {System.out.println("t2 加锁 locker2 完成");}}});t1.start();t2.start();}
}

 运行这段代码后,程序会陷入死锁

死锁原因

  1. 线程1 先获取了 lock1,然后试图获取 lock2

  2. 线程2 先获取了 lock2,然后试图获取 lock1

  3. 此时,线程1和线程2都在等待对方释放锁,但它们又都持有对方需要的锁,导致死锁。

如何避免死锁

经典案例:哲学家吃面条问题; 

避免死锁问题只需要打破上述四点的其中一点即可,对于第一点和第二点对于Java中是打破不了的,他们都是synchronized的基本特性
从第三点来看,不要让锁嵌套获取即可(但是有的时候必须嵌套,那就破除循环等待)
第四点破除循环等待:约定好加锁的顺序,让所有的线程都按照约定要的顺序来获取锁。

避免死锁问题只需要打破上述四点的其中一点即可,对于第一点和第二点对于Java中是打破不了的,他们都是synchronized的基本特性
从第三点来看,不要让锁嵌套获取即可(但是有的时候必须嵌套,那就破除循环等待)
第四点破除循环等待:约定好加锁的顺序,让所有的线程都按照约定要的顺序来获取锁

这个时候5号哲学家要拿1号筷子,但是一号筷子被1号哲学家拿着,所以5号哲学家只能等着,等1号哲学家用完。这样就不会有死锁了

http://www.dtcms.com/a/602685.html

相关文章:

  • 加密货币均线策略与传统MACD(介绍下回测框架的择时功能)
  • 青海建设厅报名网站软件工程课程设计题目
  • 网站制作 牛商网中文域名到期对网站的影响
  • 《雷电模拟器9》 [9.1.76.0][x64] [绿色纯净版] 下载
  • 网站建设要点自助建站推广
  • 开发网站的基本流程网站制作怎么做框架
  • 【经典书籍】《代码整洁之道》第十三章“并发编程”精华讲解
  • 绵阳成套配电柜厂家
  • 反向海淘独立站技术架构深度解析:从搭建到优化的全链路实践
  • 做外贸用什么网站比较好济宁网站
  • C语言程序在线编译 | 让编程更便捷,提高开发效率
  • 2025下半年软考高级系统架构设计师考试流水账
  • 微信网站平台建设表白网站制作
  • 高级边界扫描 --1-- IEEE标准1149.6
  • 【C++】STL -- list 的使用与模拟实现
  • 百度认证官方网站怎么制作网站布局
  • 劲松网站建设专门做dm单的网站
  • Go语言编译器 | 探索Go语言编译过程与优化技巧
  • 在线监测系统:农药精细化工的“安全锁”与“效率引擎”
  • Python 爬虫教程 | 豆瓣 TOP250 数据抓取与分析实战
  • 专门做创意桌椅的网站访问中国建设银行网站
  • 搭建外文网站计算机网络课程设计
  • 长沙美容网站建设百度广告优化
  • 网站建设全过程seo发外链网站
  • 《C++ Primer》和《Effective C++》哪个更难?
  • 织梦网站联系我们的地图怎么做设计室内装修的软件
  • 电影数据可视化分析系统的设计与实现
  • 显存占用、kvcache和并发学习笔记
  • wordpress网站被攻击毕节网站怎么做seo
  • 烟台市建设工程交易中心网站网站滑动效果怎么做的