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 ...
随机推荐
- 更新SVN时提示要清理,但清理失败,乱码得解决方案
问题情况如图: 解决办法: 依托工具——sqlite3, 首先在项目根目录下找到.svn文件夹,将其中的wc.db复制到工具所在路径. 如果找不到.svn,需要把隐藏文件选项勾去. 路径如图: 此时, ...
- MyEclipse项目向IDEA项目迁移
1.首先选择File->New->Project from Existing sources/Project form Version Control,如果项目在你的本地则选择 Proje ...
- 你的package包名有问题!
今天在Eclipse中运行我的Java程序中,就弹出了以下消息的窗口: 注意窗口的名字为Java Virtual Machine Launcher . Error : A JNI error has ...
- python Opencv图像基础操作
读取并显示图像 如果读取图像首先要导入OpenCV包,方法为: import cv2 读取并显示图像 img = cv2.imread("C:\test1.jpg") OpenCV ...
- 行人重识别(ReID) ——基于Person_reID_baseline_pytorch修改业务流程
下载Person_reID_baseline_pytorch地址:https://github.com/layumi/Person_reID_baseline_pytorch/tree/master/ ...
- MySQL第五天——日志
日志 log_error(错误日志) 用于记录 MySQL 运行过程中的错误信息,如,无法加载 MySQL数据库的数据文件,或权限不正确等都会被记录在此. 默认情况下,错误日志是开启的,且无法禁止. ...
- webpack webpack.config.js配置
安装指定版本的webpack npm install webpack@3.6 -g 安装live-server 运行项目插件 输入live-server 运行后自动打开网页 npm ins ...
- ForkJoinPool详解
本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码. 说在前面可以说是说明,也可以说下面是结论: ForkJoinPool 不是为了替代 ExecutorService ...
- P2254 [NOI2005]瑰丽华尔兹
链接P2254 [NOI2005]瑰丽华尔兹 首先有个很朴素的\(dp\),设\(f_{i,j,k}\)表示\(k\)时刻地点\(i,j\)的最长长度. 然后这样不能优化,考虑利用一段连续时间是同一个 ...
- Mysqldump导入数据库很慢的解决办法
https://blog.csdn.net/xizaihui/article/details/53103049 1.MySQLdump导出的SQL语句在导入到其他数据库的时候会相当慢,甚至几十秒才处理 ...