Lock和synchronized使用
该文章主要讲解如何快速应用Lock和synchronized
读者可以自行学习Lock和synchronized系统级比较;可参考并发实战等,自己决定什么场景下使有哪种锁
Lock使用案例:
public class Person { //两个线程同时调用这个方法
public void say(String msg){
int len = msg.length();
for(int i=0;i<len;i++){
System.out.print(msg.charAt(i));
}
System.out.println();
}
}
public class LockTest {
public static void main(String[] args) {
Person person = new Person();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
person.say("haohaoxuexi");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
person.say("tiantianxiangshang");
}
}
}).start();
}
}
输出的结果:
haohaoxuexi
tianhaohaoxuexitianxiangshang
hatiantianxiangshangoha
oxuexi
htiantianxiangshangaohaoxuexi
以上结果是随机生成的,每次的结果可能都不一样;主要证明并发一个对象方法时候存在线程安全问题
修改方法:
public class Person {
//为对象创建一把锁
Lock lock = new ReentrantLock();
public void say(String msg){
int len = msg.length(); //加锁
lock.lock();
try{
for(int i=0;i<len;i++){
System.out.print(msg.charAt(i));
}
System.out.println();
}finally{ //解锁
lock.unlock();
}
}
}
此时是结果正常:
tiantianxiangshang
haohaoxuexi
tiantianxiangshang
haohaoxuexi
tiantianxiangshang
haohaoxuexi
tiantianxiangshang
haohaoxuexi
基于Lock读写锁的案例:
public class Cache {
//创建一个缓存
private static Map<String, Object> cache = new HashMap<String, Object>();
//创建读写锁
private static ReadWriteLock rwl = new ReentrantReadWriteLock();
public static Object getData(String key){
//加读锁
rwl.readLock().lock();
Object value = null;
try{
value = cache.get(key);
if(value == null){
//释放读锁
rwl.readLock().unlock();
//加写锁
rwl.writeLock().lock();
try{
if(value==null){
value = "查询介质获取数据";
cache.put(key, value);
}
}finally{
//加读锁
rwl.readLock().lock();
//释放写锁
rwl.writeLock().unlock();
}
}
}finally{
//释放读锁
rwl.readLock().unlock();
}
return value;
}
}
synchronized使用案例
public class Person {
//两个线程同时调用这个方法
public void say(String msg){
int len = msg.length();
for(int i=0;i<len;i++){
System.out.print(msg.charAt(i));
}
System.out.println();
}
}
把上述代码修改成以下即可
public class Person {
public synchronized void say(String msg){
int len = msg.length();
for(int i=0;i<len;i++){
System.out.print(msg.charAt(i));
}
System.out.println();
}
}
或者修改成以下代码
public class Person {
public void say(String msg){
int len = msg.length();
synchronized(Person.class){
for(int i=0;i<len;i++){
System.out.print(msg.charAt(i));
}
System.out.println();
}
}
}
Lock和synchronized使用的更多相关文章
- (转)Lock和synchronized比较详解
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...
- Lock较synchronized多出的特性
1.尝试非阻塞形式获取锁 tryLock() :当前线程尝试获取锁,如果锁被占用返回false;如果成功则占有锁 //类似用法if(lock.tryLock()) { try { System.out ...
- Java中的Lock与synchronized
并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...
- Lock和Synchronized
1.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取锁2.Lock中的某些锁允许对共享资源的并发访问,如ReadWriteLock读写锁,readLock()获取读锁,wri ...
- Lock与synchronized的区别(浅谈)
Lock是一个接口 synchronized是一个关键字 Lock用法: synchronized用法: lock.lock() ...
- Java同步锁——lock与synchronized 的区别【转】
在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...
- 线程(六)之LOCK和synchronized
在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock.ReadWriteLock(实现类ReentrantReadWriteLock), ...
- Lock和synchronized的区别和使用
Java并发编程:Lock 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问 ...
- java多线程关键字volatile、lock、synchronized
--------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...
- Lock、synchronized和ReadWriteLock,StampedLock戳锁的区别和联系以及Condition
https://www.cnblogs.com/RunForLove/p/5543545.html 先来看一段代码,实现如下打印效果: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 1 ...
随机推荐
- 第二讲shiro异常及执行流程
在认证过程中,有一个父异常为:AuthenticationException 该异常有几个子类,分别对应不同的异常情况: (1)DisabledAccountException:账户失效异常 (2)E ...
- srs-librtmp pusher(push h264 raw)
Simple Live System Using SRS https://www.cnblogs.com/dong1/p/5100792.html 1.上面是推送文件,改成推送缓存 封装了三个函数 i ...
- 1、获取ip地址
1.获取ip地址 System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() .Select(p => p. ...
- 奇虎360的开源OpenResty Windows版本
https://github.com/LomoX-Offical/nginx-openresty-windows
- div+css做出带三角的弹出框 和箭头
一.三角形 https://blog.csdn.net/Szu_AKer/article/details/51755821 notice:三角的那部分可以用图片作为背景,但是容易出现杂边.所以利用cs ...
- python高级:垃圾回收机制
---恢复内容开始--- 垃圾回收机制 1.计数引用机制 就是一个变量.数据结构.对象当没有人引用时,python的会启用垃圾回收机制,将其从内存中删除. 怎么看引用的次数呢?sys模块提供的sys. ...
- linux下caffe的命令运行脚本
参考:https://www.cnblogs.com/denny402/p/5076285.html 首先编译: make -j8 make pycaffe 注:下面的--solver=.... 等价 ...
- php str_ireplace()函数 语法
php str_ireplace()函数 语法 作用:字符串替换操作,不区分大小写 语法:str_ireplace(find,replace,string,count)大理石平台规格 参数: 参数 描 ...
- php选择文件夹上传
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- bzoj2460题解
[题意分析] 给你一个可重复数集,要求从中选取一个关于异或空间线性无关的子集,使子集的权值和最大. [解题思路] 定义:一个有序对(S,I)称为拟阵当且仅当该有序对满足以下性质: 1.有穷性:S是一个 ...