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 ...
随机推荐
- 使用docxtemplater来处理word模板
工作中遇到需要根据不同数据来处理模板word的情况,网上搜索了一番之后,找到了一个叫做docxtemplater的库,使用起来非常便携,也十分满足此次的需求. 这次就来记录一下docxtemplate ...
- vue.js(14)--自定义全局指令
<input type="text" class="form-control" v-model="keywords" v-focus& ...
- java 类加载及实例化的调用顺序
1.没有继承的情况 单独一个类的场景下,初始化顺序为依次为 静态变量和静态代码块(看两者的书写顺序),继承的基类的构造函数,成员变量,被调用的构造函数. 代码呈现: public class Test ...
- ASE Beta Sprint - backend scrum 4
本次scrum于2019.12.10在sky garden进行,持续10分钟. 参与人: Xin Kang, Zhikai Chen, Lihao Ran, Hao Wang 请假: Ning Jia ...
- [转]Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) --有部份地方有问题
Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) [转载]原文地址:http://canonind.blog.51cto.com/8239025/1883066 一.安装前 ...
- PyCharm使用技巧总结
PyCharm高频使用快捷键 快速修复:ALT + ENTER 搜索: 双击Shif 垂直分隔窗口: ALT + V 另起一行: SHIFT + ENTER 删除当前插入符所在的行: Ctrl + Y ...
- mysql优化-覆盖索引查询,join
1 原始sql: SELECT a.* FROM event_data a WHERE a.receive_time >= '2018-03-28 00:00:00' AND a.receive ...
- bzoj4009 [HNOI2015]接水果 整体二分+扫描线+树状数组+dfs序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4009 题解 考虑怎样的情况就会有一个链覆盖另一个链. 设被覆盖的链为 \(a - b\),覆盖 ...
- Java初步
Java的核心优势:跨平台 Java SE:标准版Java EE:企业级Java ME:微型版 源文件(*.java)→编译器→字节码文件(*.class)→(类装载器→字节码校验器→解释器)[JRE ...
- Flink 实战:如何解决生产环境中的技术难题?
大数据作为未来技术的基石已成为国家基础性战略资源,挖掘数据无穷潜力,将算力推至极致是整个社会面临的挑战与难题. Apache Flink 作为业界公认为最好的流计算引擎,不仅仅局限于做流处理,而是一套 ...