网站建设答辩ppt模板,腾讯学生服务器可以做网站吗,沈阳做网站找黑酷科技,网站怎么盈利的目录 前言
一、确定需要多个锁的场景
1.独立资源保护
2.部分依赖资源
二、避免死锁
三、锁粒度与并发性能
1. 粗粒度锁定
2.细粒度锁定
四、设计策略#xff1a;减少资源依赖
1.资源分离
2.无锁设计
3.锁合并
五、Demo讲解
总结#xff1a; 前言 当多个线程需要…目录 前言
一、确定需要多个锁的场景
1.独立资源保护
2.部分依赖资源
二、避免死锁
三、锁粒度与并发性能
1. 粗粒度锁定
2.细粒度锁定
四、设计策略减少资源依赖
1.资源分离
2.无锁设计
3.锁合并
五、Demo讲解
总结 前言 当多个线程需要操作共享资源时为了确保数据的一致性和避免竞争条件通常会使用多个锁来进行同步。这种情况下如何正确使用多个锁成为一个复杂而关键的问题。下面是一篇十分详细的博客介绍多线程多锁场景下的最佳实践和注意事项。
一、确定需要多个锁的场景
1.独立资源保护
定义当不同的资源例如文件、数据库连接等由不同的锁保护时。示例一个线程需要读取文件A并写入文件B而另一个线程读取文件B并写入文件A这两个操作可以分别使用不同的锁。
2.部分依赖资源
定义多个资源之间存在某种程度的依赖关系但操作它们的线程可能不会同时访问所有资源。示例两个线程分别操作两个互相有数据交换的队列可分别对两个队列加锁但在交换数据时需要特别小心处理锁的顺序。
二、避免死锁
死锁是多线程编程中常见的问题特别是在使用多个锁的情况下更容易发生。要避免死锁可以采取以下策略
按顺序获取锁对多个资源使用相同的顺序获取锁以避免循环等待。设置超时时间在获取锁的过程中设置超时时间一段时间后未能获取到锁就放弃或重试。使用高级同步工具比如信号量Semaphores或条件变量Condition Variables它们提供了更灵活的同步机制有助于避免死锁。
三、锁粒度与并发性能
1. 粗粒度锁定 优点实现简单易于理解和维护。缺点可能导致大量线程等待从而降低并发性能。示例一个单一的大锁保护整个资源集合。 2.细粒度锁定 优点提高并发性能因为锁的范围缩小减少了线程等待的概率。缺点实现复杂需要更精细的设计和管理。示例为每个独立资源或资源的部分使用单独的小锁。 四、设计策略减少资源依赖
1.资源分离 定义尽量将共享资源划分为独立的部分使得每个部分只需一个锁。示例将一个大型数据库拆分为多个独立的部分每个部分由不同的线程和锁管理。 2.无锁设计 定义通过无锁编程如使用原子操作来完全避免锁。示例使用Java的AtomicInteger类进行计数器操作。 3.锁合并 定义在某些情况下将多个锁合并为一个锁以简化锁管理。示例如果两个资源总是一起被访问可以用一个锁来保护它们。 五、Demo讲解
package com.ctb.demo;/*** 关键字synchronized取得的锁都是对象锁而不是把一段代码方法当做锁* 所以代码中哪个线程先执行synchronized关键字的方法哪个线程就持有该方法所属对象的锁Lock* * 在静态方法上加synchronized关键字表示锁定.class类类一级别的锁独占.class类* * author biao** 2024年*/
public class MyThread2 {private int num 0;public synchronized void printNum(String tag) {try {if (tag.equals(a)) {num100;System.out.println(tag a,set num over!);Thread.sleep(1000);}else {num 200;System.out.println(tag b,set num over!);}System.out.println(tag tag , num num);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {final MyThread2 m1 new MyThread2();final MyThread2 m2 new MyThread2();Thread t1 new Thread(new Runnable() {Overridepublic void run() {m1.printNum(a);}});Thread t2 new Thread(new Runnable() {Overridepublic void run() {m2.printNum(b);}});t1.start();t2.start();}}
结果 package com.ctb.demo;/*** 关键字synchronized取得的锁都是对象锁而不是把一段代码方法当做锁* 所以代码中哪个线程先执行synchronized关键字的方法哪个线程就持有该方法所属对象的锁Lock* * 在静态方法上加synchronized关键字表示锁定.class类类一级别的锁独占.class类* * author biao** 2024年2月28日-上午12:07:26*/
public class MyThread2 {private static int num 0;// staticpublic static synchronized void printNum(String tag) {try {if (tag.equals(a)) {num100;System.out.println(tag a,set num over!);Thread.sleep(1000);}else {num 200;System.out.println(tag b,set num over!);}System.out.println(tag tag , num num);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {final MyThread2 m1 new MyThread2();final MyThread2 m2 new MyThread2();Thread t1 new Thread(new Runnable() {Overridepublic void run() {m1.printNum(a);}});Thread t2 new Thread(new Runnable() {Overridepublic void run() {m2.printNum(b);}});t1.start();t2.start();}}结果 总结 关键字synchronized取得的锁都是对象锁而不是把一段代码方法当做锁 所以代码中哪个线程先执行synchronized关键字的方法哪个线程就持有该方法所属对象的锁Lock 在静态方法上加synchronized关键字表示锁定.class类类一级别的锁独占.class类