Lock接口的认识和使用
2024-09-26 03:24:22
保证线程安全演进:
synchronized
volatile
AtomicInteger
Lock接口提供的方法:
void lock():加锁
void unlock():解锁
void lockInterruptibly():在多个线程并发获取锁的时候,那么,当有些线程拿不到锁时会等待,会不停的去抢占资源,在抢占的过程中,使用synchronized是无法进行中断的,那么,使用lockInterruptibly()方法,如果在抢占过程中发出一个中断,是可以中断的。
tryLock():非阻塞的获取锁,如果获取锁成功,返回true;否则,返回false
package com.roocon.thread.t9; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Sequence { private int value;
Lock lock = new ReentrantLock();//所有的线程用一把锁,来保证线程安全 public int getNext() {
lock.lock();
int a = value ++;
lock.unlock();
return a;
} public static void main(String[] args) { Sequence s = new Sequence(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); } }
运行结果:
Thread-0 0
Thread-2 2
Thread-1 1
Thread-0 3
Thread-1 5
Thread-2 4
Thread-0 6
Thread-1 7
Thread-2 8
...
Lock需要显示的获取锁和释放锁,繁琐能让代码更灵活;
使用Lock可以方便的实现公平性;public ReentrantLock(boolean fair){...}
非阻塞的获取锁;
能被中断的获取锁;
超时获取锁;(在一定时间内去获取锁)
synchronized不需要显示的获取锁和释放锁,简单
最新文章
- bzoj2693--莫比乌斯反演+积性函数线性筛
- Mysql有用的面试题
- ToString和Convert.ToString处理null值
- Media Player插件
- 设置centos7语言显示环境
- 放假回来啦!!小技能:一个div不给width,怎么让它居中捏?`(*∩_∩*)′
- python redis使用心得
- jQuery 跨域访问问题解决方法(转)
- FFmpeg 维基百科
- Android GridView 添加 网格线解决办法
- swift-01-利用元组判断字符串出现次数
- 我是怎么拿到百度2016校招Offer的——IT技术类校招成功面经
- app被Rejected 的各种原因翻译(转)
- AWS(0) - Amazon Web Services
- codeforces 236A . Boy or Girl(串水问题)
- Hive 常用函数
- 修改wampsever默认密码
- QT 读写配置文件 .ini
- 2017-9-24-Linux移植:ubuntu server 16.04无法联网&;无法apt-get update解决
- 基于akka-http搭建restfull框架
热门文章
- vue element-ui el-date-picker如何限制选择时间为当天之前
- kubernetes 配置网络插件 flannel
- wireshark分析https数据包解密前后的特点
- viewer与 iview Carousel(走马灯) 结合使用,图片无法显示
- 使用Cloudera Manager搭建MapReduce集群及MapReduce HA
- Docker——概念学习
- 个性化排序算法实践(四)——GBDT+LR
- git教程——简单总结
- if __name__ == ";__main__";,python主程序入口
- VS调试web api服务