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 ...
随机推荐
- JS中数组和字符串方法的简单整理
一.数组: 数组的基本方法: 1.增:arr.unshift() /push() 前增/后增 2.删:arr.shift() /pop ...
- Linux基于Hadoop2.8.0集群安装配置Hive2.1.1及基础操作
前言 安装Apache Hive前提是要先安装hadoop集群,并且hive只需要在hadoop的namenode节点集群里安装即可,安装前需保证Hadoop已启(动文中用到了hadoop的hdfs命 ...
- netcore项目使用swagger开发
首先我创建一个netcore项目,我使用的工具是vs2019 这里需要注意的是,看情况选择是否开启身份验证,一般是没有需求的,这里因为我是测试使用所以需要取消勾兑为https配置,并且我没有启用doc ...
- 前端每日实战:32# 视频演示如何用纯 CSS 创作六边形按钮特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xjoOeM 可交互视频教程 此视频 ...
- 外媒:Apple面临着印度iPhone的停用
据外媒报道:印度电信管理局(TRAI)制定遏制令人讨厌的消息的新规则可能导致印度数百万部iPhone的停用. 该监管机构本周早些时候宣布了“2018年电信商业通信客户偏好规定”,根据该规定,它已提议“ ...
- LOJ 2840「JOISC 2018 Day 4」糖
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...
- B2C自营商城的订单设计方案
B2C自营商城的订单设计方案 2018年06月01日 17:19:00 lkx94 阅读数 1640 去年我们的美妆社区APP,上线了自有商城.之后经过多次版本迭代,商城系统的模块已经基本健全,值 ...
- 对vue的api的研究
Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silent = t ...
- linux运维、架构之路-数据库迁移
一.wordpress搭建 1.wordpress下载部署 cd /server/tools/ wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN. ...
- github配置和使用
通过手册指导生产ssh key或取已有的ssh key root@iZwz93telmwbh624e5zetqZ:~# ls -al ~/.ssh total drwx------ root root ...