多线程中的锁的几种用法总结

一、ReentrantLock

 1 package com.ietree.basicskill.mutilthread.lock;
 2
 3 import java.util.concurrent.locks.Lock;
 4 import java.util.concurrent.locks.ReentrantLock;
 5
 6 /**
 7  * Created by Administrator on 2017/5/17.
 8  */
 9 public class UseReentrantLock {
10
11     private Lock lock = new ReentrantLock();
12
13     public void method1(){
14         try {
15             lock.lock();
16             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");
17             Thread.sleep(1000);
18             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");
19             Thread.sleep(1000);
20         } catch (InterruptedException e) {
21             e.printStackTrace();
22         } finally {
23
24             lock.unlock();
25         }
26     }
27
28     public void method2(){
29         try {
30             lock.lock();
31             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method2..");
32             Thread.sleep(2000);
33             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method2..");
34             Thread.sleep(1000);
35         } catch (InterruptedException e) {
36             e.printStackTrace();
37         } finally {
38
39             lock.unlock();
40         }
41     }
42
43     public static void main(String[] args) {
44
45         final UseReentrantLock ur = new UseReentrantLock();
46         Thread t1 = new Thread(new Runnable() {
47             @Override
48             public void run() {
49                 ur.method1();
50                 ur.method2();
51             }
52         }, "t1");
53
54         t1.start();
55         try {
56             Thread.sleep(10);
57         } catch (InterruptedException e) {
58             e.printStackTrace();
59         }
60         //System.out.println(ur.lock.getQueueLength());
61     }
62
63 }

二、ReentrantReadWriteLock

 1 package com.ietree.basicskill.mutilthread.lock;
 2
 3 import java.util.concurrent.locks.ReentrantReadWriteLock;
 4
 5 /**
 6  * Created by Administrator on 2017/5/17.
 7  */
 8 public class UseReentrantReadWriteLock {
 9
10     private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
11     private ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
12     private ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
13
14     public void read(){
15         try {
16             readLock.lock();
17             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
18             Thread.sleep(3000);
19             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
20         } catch (Exception e) {
21             e.printStackTrace();
22         } finally {
23             readLock.unlock();
24         }
25     }
26
27     public void write(){
28         try {
29             writeLock.lock();
30             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");
31             Thread.sleep(3000);
32             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");
33         } catch (Exception e) {
34             e.printStackTrace();
35         } finally {
36             writeLock.unlock();
37         }
38     }
39
40     public static void main(String[] args) {
41
42         final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();
43
44         Thread t1 = new Thread(new Runnable() {
45             @Override
46             public void run() {
47                 urrw.read();
48             }
49         }, "t1");
50         Thread t2 = new Thread(new Runnable() {
51             @Override
52             public void run() {
53                 urrw.read();
54             }
55         }, "t2");
56         Thread t3 = new Thread(new Runnable() {
57             @Override
58             public void run() {
59                 urrw.write();
60             }
61         }, "t3");
62         Thread t4 = new Thread(new Runnable() {
63             @Override
64             public void run() {
65                 urrw.write();
66             }
67         }, "t4");
68
69 //        t1.start();
70 //        t2.start();
71
72 //        t1.start(); // R
73 //        t3.start(); // W
74
75         t3.start();
76         t4.start();
77     }
78 }

三、Condition

 1 package com.ietree.basicskill.mutilthread.lock;
 2
 3 import java.util.concurrent.locks.Condition;
 4 import java.util.concurrent.locks.Lock;
 5 import java.util.concurrent.locks.ReentrantLock;
 6
 7 /**
 8  * Created by Administrator on 2017/5/17.
 9  */
10 public class UseCondition {
11     private Lock lock = new ReentrantLock();
12     private Condition condition = lock.newCondition();
13
14     public void method1(){
15         try {
16             lock.lock();
17             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入等待状态..");
18             Thread.sleep(3000);
19             System.out.println("当前线程:" + Thread.currentThread().getName() + "释放锁..");
20             condition.await();    // Object wait
21             System.out.println("当前线程:" + Thread.currentThread().getName() +"继续执行...");
22         } catch (Exception e) {
23             e.printStackTrace();
24         } finally {
25             lock.unlock();
26         }
27     }
28
29     public void method2(){
30         try {
31             lock.lock();
32             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入..");
33             Thread.sleep(3000);
34             System.out.println("当前线程:" + Thread.currentThread().getName() + "发出唤醒..");
35             condition.signal();        //Object notify
36         } catch (Exception e) {
37             e.printStackTrace();
38         } finally {
39             lock.unlock();
40         }
41     }
42
43     public static void main(String[] args) {
44
45         final UseCondition uc = new UseCondition();
46         Thread t1 = new Thread(new Runnable() {
47             @Override
48             public void run() {
49                 uc.method1();
50             }
51         }, "t1");
52         Thread t2 = new Thread(new Runnable() {
53             @Override
54             public void run() {
55                 uc.method2();
56             }
57         }, "t2");
58         t1.start();
59
60         t2.start();
61     }
62 }

四、ManyCondition

  1 package com.ietree.basicskill.mutilthread.lock;
  2
  3 import java.util.concurrent.locks.Condition;
  4 import java.util.concurrent.locks.ReentrantLock;
  5
  6 /**
  7  * Created by Administrator on 2017/5/17.
  8  */
  9 public class UseManyCondition {
 10     private ReentrantLock lock = new ReentrantLock();
 11     private Condition c1 = lock.newCondition();
 12     private Condition c2 = lock.newCondition();
 13
 14     public void m1(){
 15         try {
 16             lock.lock();
 17             System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m1等待..");
 18             c1.await();
 19             System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m1继续..");
 20         } catch (Exception e) {
 21             e.printStackTrace();
 22         } finally {
 23             lock.unlock();
 24         }
 25     }
 26
 27     public void m2(){
 28         try {
 29             lock.lock();
 30             System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m2等待..");
 31             c1.await();
 32             System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m2继续..");
 33         } catch (Exception e) {
 34             e.printStackTrace();
 35         } finally {
 36             lock.unlock();
 37         }
 38     }
 39
 40     public void m3(){
 41         try {
 42             lock.lock();
 43             System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m3等待..");
 44             c2.await();
 45             System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m3继续..");
 46         } catch (Exception e) {
 47             e.printStackTrace();
 48         } finally {
 49             lock.unlock();
 50         }
 51     }
 52
 53     public void m4(){
 54         try {
 55             lock.lock();
 56             System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");
 57             c1.signalAll();
 58         } catch (Exception e) {
 59             e.printStackTrace();
 60         } finally {
 61             lock.unlock();
 62         }
 63     }
 64
 65     public void m5(){
 66         try {
 67             lock.lock();
 68             System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");
 69             c2.signal();
 70         } catch (Exception e) {
 71             e.printStackTrace();
 72         } finally {
 73             lock.unlock();
 74         }
 75     }
 76
 77     public static void main(String[] args) {
 78
 79
 80         final UseManyCondition umc = new UseManyCondition();
 81         Thread t1 = new Thread(new Runnable() {
 82             @Override
 83             public void run() {
 84                 umc.m1();
 85             }
 86         },"t1");
 87         Thread t2 = new Thread(new Runnable() {
 88             @Override
 89             public void run() {
 90                 umc.m2();
 91             }
 92         },"t2");
 93         Thread t3 = new Thread(new Runnable() {
 94             @Override
 95             public void run() {
 96                 umc.m3();
 97             }
 98         },"t3");
 99         Thread t4 = new Thread(new Runnable() {
100             @Override
101             public void run() {
102                 umc.m4();
103             }
104         },"t4");
105         Thread t5 = new Thread(new Runnable() {
106             @Override
107             public void run() {
108                 umc.m5();
109             }
110         },"t5");
111
112         t1.start();    // c1
113         t2.start();    // c1
114         t3.start();    // c2
115
116
117         try {
118             Thread.sleep(2000);
119         } catch (InterruptedException e) {
120             e.printStackTrace();
121         }
122
123         t4.start();    // c1
124         try {
125             Thread.sleep(2000);
126         } catch (InterruptedException e) {
127             e.printStackTrace();
128         }
129         t5.start();    // c2
130
131     }
132 }
时间: 2024-08-06 11:36:02

多线程中的锁的几种用法总结的相关文章

多线程中的锁系统(一)-基础用法

目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 4:monitor使用 二:mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.WriteLine(obj); } //lock IL会编译成如下写法 bo

c#语言-多线程中的锁系统(一)

介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 4:monitor使用 二:mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) {

c#语言-多线程中的锁系统

介绍 平常在多线程开发中,总避免不了线程同步.这次就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 二: mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.Wri

mysql中模糊查询的四种用法介绍

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来. 另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件 SELECT * FROM [user] WHERE u_name LIKE

JSP中的include的两种用法

1.两种用法 <@inlcude file ="header.jsp"/> 此时引入的是静态的jsp文件,它将引入的jsp中的源代码原封不动地附加到当前文件中,所以在jsp程序中使用这个指令的时候file里面的值(即要导入的文件)不能带多余的标签或是与当前jsp文件重复的东西.例如里面不要包含<html><body>这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错. <jsp:include page

java 多线程中的锁的类别及使用

目前在Java中存在两种锁机制: synchronized Lock Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea. 数据同步需要依赖锁,那锁的同步又依赖谁? synchronized给出的答案是在软件层面依赖JVM, 而Lock给出的方案是在硬件层面依赖特殊的CPU指令 Synchronized 其应用层的语义是可以把任何一个非null对象作为"锁" 当synchronized作用在方法上时,锁住的便是对象实例(this): 当作用在静态方法

多线程中的锁

乐观锁和悲观锁 乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面也引入了类似的思想,所以这里还是有必要讲解一下. 悲观锁指对数据被外界修改持保守的态度,认为数据很容易就会被其他线程修改,所以在数据被处理前就先对数据加锁,并在整个数据处理过程中,使数据处于锁定状态,悲观锁的实现往往依靠数据库提供的锁机制,即在数据库中,在对数据记录操作前给记录加排它锁,如果获取锁失败,则说明数据正在被其他线程修改,当前线程则等待或者抛出异常,如果获取锁成功,则对记录进行操作,然后提交事务后释放排它锁 乐观锁

java多线程中synchronize锁的使用和学习,Thread多线程学习(二)

synchronize我的理解是为了保证程序中的原子性和一致性,即当你有两个线程同时操作一段代码的时候,要让这段代码的执行是在任何状态下都是正确的,首先要保证synchronize的使用要对同一个对象和同一把锁使用. [java] view plain copy print? <span style="font-size:14px;">public class TraditionalThreadSynchronized { public static void main(S

多线程中的锁系统(二)-volatile、Interlocked、ReaderWriterLockSlim

介绍 上章主要说排他锁的直接使用方式.但实际当中全部都用锁又太浪费了,或者排他锁粒度太大了. 这一次我们说说升级锁和原子操作. 目录 1:volatile 2:  Interlocked 3:ReaderWriterLockSlim 4:总结 一:volatile 简单来说: volatile关键字是告诉c#编译器和JIT编译器,不对volatile标记的字段做任何的缓存.确保字段读写都是原子操作,最新值. 这不就是锁吗?   其这货它根本不是锁, 它的原子操作是基于CPU本身的,非阻塞的. 因