5,临界区 之 lock
前提背景:多个并发线程共享同一个资源时,为防止这些共享资源可能出现的错误或数据不一致问题,提出了临界区的概念
临界区: 指一个用以访问共享资源的代码块,这个代码块在同一时间内只能允许一个线程访问
实现方式:synchronized 或 lock
lock 方式 如下 UserLock 给addMoney方法加上了 lock(), 相当于加了锁,后面同时起了3个线程,都调这个方法,因为设置了sleep 3 秒,可以看到 会有2个线程处于 WAITTING 的状态,直到锁释放
package com.zyguo.thread; import java.util.concurrent.locks.ReentrantLock; public class UserLock {
private int money;
private int id;
private ReentrantLock lock = new ReentrantLock(); public UserLock( int id ){
this.setId(id);
}
public int getMoney() {
return money;
} public int addMoney( int incrNum ){
try {
lock.lock();
System.out.println("addMoney, lock=" + Thread.currentThread() + ",money=" + this.money );
this.money = this.money + incrNum;
Thread.sleep( 3000 );
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
lock.unlock();
System.out.println("addMoney, unlock=" + Thread.currentThread() + ",money=" + this.money );
}
return this.money;
} public int reducMoney( int reducNum ){
this.money = this.money - reducNum;
return this.money;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
package com.zyguo.thread; import java.util.ArrayList; public class Main_lock {
public static void main(String[] args) {
final UserLock u = new UserLock(1);
int threadNum = 3;
final ThreadGroup tgroup = new ThreadGroup("test-threadgroup");
final ArrayList<Thread> tList = new ArrayList<>();
//定义10个线程
for( int i = 0; i < threadNum; i++ ){
Thread t = new Thread( tgroup, new Runnable() {
@Override
public void run() {
u.addMoney(1);
}
} ,"test-thread-" + i); tList.add( t );
t.start();
System.out.println("start thread = " + t );
} //监控线程的活动的子线程数
Thread t = new Thread( new Runnable() {
@Override
public void run() {
int activeCount = tgroup.activeCount();
while ( activeCount > 0 ) {
for (Thread thread : tList) {
System.out.println( thread + ",state=" + thread.getState() );
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
activeCount = tgroup.activeCount();
}
}
}); t.start(); } }
结果如下
start thread = Thread[test-thread-0,5,test-threadgroup]
addMoney, lock=Thread[test-thread-0,5,test-threadgroup],money=0
start thread = Thread[test-thread-1,5,test-threadgroup]
start thread = Thread[test-thread-2,5,test-threadgroup]
Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-1,5,test-threadgroup],state=WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-1,5,test-threadgroup],state=WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-1,5,test-threadgroup],state=WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-1,5,test-threadgroup],state=WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
addMoney, lock=Thread[test-thread-1,5,test-threadgroup],money=1
addMoney, unlock=Thread[test-thread-0,5,test-threadgroup],money=2
Thread[test-thread-0,5,],state=TERMINATED
Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
Thread[test-thread-0,5,],state=TERMINATED
Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
Thread[test-thread-0,5,],state=TERMINATED
Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-2,5,test-threadgroup],state=WAITING
addMoney, unlock=Thread[test-thread-1,5,test-threadgroup],money=2
addMoney, lock=Thread[test-thread-2,5,test-threadgroup],money=2
Thread[test-thread-0,5,],state=TERMINATED
Thread[test-thread-1,5,],state=TERMINATED
Thread[test-thread-2,5,test-threadgroup],state=TIMED_WAITING
Thread[test-thread-0,5,],state=TERMINATED
Thread[test-thread-1,5,],state=TERMINATED
Thread[test-thread-2,5,test-threadgroup],state=TIMED_WAITING
addMoney, unlock=Thread[test-thread-2,5,test-threadgroup],money=3
5,临界区 之 lock的更多相关文章
- C#线程同步(1)- 临界区&Lock
文章原始出处 http://xxinside.blogbus.com/logs/46441956.html 预备知识:线程的相关概念和知识,有多线程编码的初步经验. 一个机会,索性把线程同步的问题在C ...
- [转]C#线程同步(1)- 临界区&Lock
第一印象,C#关于线程同步的东西好多,保持了C#一贯的大杂烩和四不象风格(Java/Delphi).临界区跟Java差不多只不过关键字用lock替代了synchronized,然后又用Moniter的 ...
- Lock同步锁--线程同步
Lock-同步锁 Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步.Lock可以显示的加锁.解锁.每次只能有一个线程对lock对象加锁. Lock有ReadLock ...
- C#线程同步(2)- 临界区&Monitor
文章原始出处 http://xxinside.blogbus.com/logs/46740731.html 预备知识:C#线程同步(1)- 临界区&Lock 监视器(Monitor)的概念 可 ...
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- Lock的await/singal 和 Object的wait/notify 的区别
在使用Lock之前,我们都使用Object 的wait和notify实现同步的.举例来说,一个producer和consumer,consumer发现没有东西了,等待,produer生成东西了,唤醒. ...
- 6,synchronized, lock 区别
参考文档 http://zzhonghe.iteye.com/blog/826162 http://houlinyan.iteye.com/blog/1112535 1,ReentrantLock 拥 ...
- 自旋锁Spin lock与互斥锁Mutex的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- Operating System-进程间互斥的方案-保证同一时间只有一个进程进入临界区(3)- TSL指令
本文接上一篇文章继续介绍如何实现同一时间只允许一个进程进入临界区的机制.本文主要介绍TSL指令. 方案汇总 屏蔽中断 锁变量 严格轮换法 TSL指令 Peterson解法 一.What is TSL ...
随机推荐
- 使用 XML-RPC 为 C++ 应用程序启用 Web 服务
http://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/ 引言 Internet 现在的受欢迎程度越来越高,由于这个原因及其固有的优势, ...
- 29-中国剩余定理CRT
https://blog.csdn.net/u010468553/article/details/38346195 中国剩余定理[数论] 2014年08月02日 12:55:59 阅读数:2351 中 ...
- SqlServer性能瓶颈分析
SqlServer性能瓶颈分析 一.内存瓶颈分析--SQLServer:Buffer Manager SELECT TOP 312 * FROM sys.dm_os_performance_coun ...
- VS优化编译配置
在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分钟左 ...
- input框添加阴影效果
.input:hover,.input:focus{ border:1px solid #85afe1; -webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0 ...
- jquery中html()、text()、val()的区别
(2013-03-26 10:49:16) 转载▼ 分类: jquery .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改 ...
- 01 A Counting DNA Nucleotides
Problem A string is simply an ordered collection of symbols selected from some alphabet and formed i ...
- [GO]匿名字段
package main import ( "fmt" ) type Person struct { name string sex byte age int } type Stu ...
- Spring bean管理器 bean实例化的三种方式
bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...
- Python之算法基础
1>递归相关: 递归:递归算法是一种直接或间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且 易于 ...