理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的.

1.如何创建锁?

Lock lock = new ReentrantLock();

2.如何使用锁?

可以参看Lock文档,其使用格式如下:

class X {private final ReentrantLock lock = new ReentrantLock();// ...public void m() {lock.lock();  // block until condition holdstry {// ... method body} finally {lock.unlock()}}}

在要用的方法前加上锁,比如写操作,然后在finally中将锁打开.

这里,将前文java核心知识点学习----多线程并发之线程同步中的代码改用Lock实现数据同步,改写代码如下:

package com.amos.concurrent;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @ClassName: LockTest* @Description: Lock学习* @author: amosli* @email:hi_amos@outlook.com* @date Apr 22, 2014 1:48:36 AM*/
public class LockTest {public static void main(String[] args) {new LockTest().init();}private void init() {final OutPuter outPuter = new OutPuter();// 新建一个线程new Thread(new Runnable() {public void run() {while (true) {// 休息10mstry {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}outPuter.output("hi_amos");// 输出}}}).start();new Thread(new Runnable() {public void run() {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}outPuter.output("amosli");}}}).start();}static class OutPuter {// 方式1:使用synchronized关键字// public synchronized void output(String name) {// int length = name.length();// for (int i = 0; i < length; i++) {// System.out.print(name.charAt(i));// }// System.out.println();// }// 方式2:使用Lock锁Lock lock = new ReentrantLock();public void output(String name) {lock.lock();// 加锁int length = name.length();// 输出name,逐个字节读取,并输出try {for (int i = 0; i < length; i++) {System.out.print(name.charAt(i));}System.out.println();} finally {lock.unlock();// 解锁}}}
}

3.synchronized关键字与Lock的区别?

1).Lock是Java5中的新特性,更加面向对象.更类似于生活中的锁.

2).Lock锁一般需要手动开启和关闭,而synchronized则不需要.

建议优先使用Lock.

4.注意事项:

1)多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥.

2)要实现两个线程互斥,那么要将锁加到同一个被访问对象上.

3)如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁,总之,读的时候用读锁,写的时候用写锁!

5.设计一个缓存系统

什么是缓存系统? 就是看本地是否已经缓存过此数据,如果已经缓存过,那就直接拿来用;如果没有缓存过,那就查询数据库.

下面看代码:

private Map<String, Object> cache = new HashMap<String, Object>();public synchronized Object getData(String key){Object object = cache.get(key);if (object==null) {object = "1323";//实际是去queryDB();}return object;}

这里其实是一个超级简单的缓存系统,原理就是:第一次访问的时候把值存入到cache中,第二次访问时,先去看cache中是否有值如果有值,那么就直接去取值,而不是从数据库中去取.

为什么要加上synchronized? 这是为了保持数据互斥,访问的时候不相互影响,因为其中有对object进行赋值操作,这是一个写操作,所以最好加上锁.

如何优化?

private ReadWriteLock rwl = new ReentrantReadWriteLock();public synchronized Object getData(String key){rwl.readLock();//read lockObject object = cache.get(key);try{if (object==null) {rwl.readLock().unlock();//释放锁rwl.writeLock().lock();//对写加锁try{object = "1323";//实际是去queryDB();}finally{rwl.writeLock().unlock();}}}finally{rwl.readLock().unlock();}return object;}

上面的代码运用到了刚学到的知识,对所有读和写进行加锁,以保持线程间的互斥,要特别注意的是要在finally中把锁打开,不管程序是否执行成功,因为如果不解锁,那么程序将会产生死锁,关于死锁,将在接下来的文章中介绍.

转载于:https://www.cnblogs.com/ncy1/p/9164474.html

Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统相关推荐

  1. 十年BAT架构履历,铁柱磨针成188页Java核心知识点

    首先祝快乐,另外也希望这篇文章可以帮助到大家. Java核心知识点.覆盖了面试,JVM.锁.并发.Java反射.Spring原理.微服务.Zookeeper.数据库.数据结构等大量知识点.总计118页 ...

  2. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  3. 最全最新的的Java核心知识点整理!!! 【推荐】

    前言: 想要文档版的小伙伴们可以私信我领取哦,更加清晰 一目了然 ~ Java核心知识点! 博客整理出来的稍微有点乱~ 目录 目录 -1 JVM - 19 2.1. 线程 - 20 2.2. JVM ...

  4. java获取当前日期的前一天日期,Java核心知识点

    一.分布式架构学习路线图 据统计,人的阅读时间在20分钟以内是能够达到全身心投入的,顾文章单张篇幅以后会尽量缩短,但更新会尽量相应频繁一些. 二.计算机软件发展历史 首先我们了解下计算机软件的发展历史 ...

  5. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...

  6. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析2)

    Qt事件机制 QT-UI 后端 重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程&quo ...

  7. 牛逼了!8000页Java 核心知识点+面试题整理,超全!

    今年金九银十要来了,很多小伙伴都在准备跳槽.小编为大家汇总了份Java核心知识点面试题和答案,基本上涵盖了所有后端技术栈,相信可以帮助大家拿到自己心仪的offer. 截了几张图,大家可以仔细查看左边的 ...

  8. Java面试,如何设计一个秒杀系统

    Java面试,如何设计一个秒杀系统说起秒杀,我想你肯定不陌生,从双十一购物到春节抢红包,再到逢年过节抢⻋票,"秒杀"的场景在我们的生活中处处可⻅.简单来说,秒杀就是在同一个时刻有大 ...

  9. Java数据结构与算法-----如何设计一个排队系统

    1.问题 设计一个排队系统,能够让每个进入队的用户都能看到自己在队列中所处的位置和变化.队列可能随时有人加入和退出,当有人退出时影响到用户的位置需要及时的反馈到用户. 2.问题分析: 不仅要实现队列常 ...

最新文章

  1. jenkins+maven+Tomcat+shell构建自动化部署
  2. Kettle7 java 远程执行Trans/Job
  3. Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较
  4. 互联网日报 | 3月22日 星期一 | 苹果iMac Pro全球下架;知乎更新上市招股书;字节跳动成立朝夕光年奇想基金...
  5. 容器编排技术 -- Kubernetes kubectl scale 命令详解
  6. VoLTE技术中的会话持续性-SRVCC
  7. 中国计算机学会推荐国际学术期刊--数据库/数据挖掘/内容检索
  8. jbpm6 mysql_JBPM6把默认的H2数据库替换成mySql
  9. LINUX上安装SSH
  10. java-php-python-ssm社区志愿者服务管理系统计算机毕业设计
  11. fastnest怎么一键排版_文字一键排版工具,排版助手(gidot typesetter)使用攻略
  12. javawebJAVAJSP酒店预订系统jsp酒店管理系统jsp民宿预订酒店jsp客房预订系统jsp宾馆客房预订系统
  13. MATLAB | 读取视频并保存帧图像
  14. 马来西亚SIRIM认证
  15. 新华三与中国移动完成IPv6随流检测互通测试
  16. LiteOS学习笔记-1LiteOS内核
  17. HBuilder输入变成繁体处理方法
  18. php swoft 路由,(swoft-2.x框架)1、使用入门
  19. 无人车高手,与华为云上的少年热血
  20. 李大潜院士给数学学院新生的六点建议

热门文章

  1. 经济危机过后,中国会变成什么样
  2. 聚焦CSDN技术主题月:深度学习框架的重构与思考专场回顾
  3. 增强现实(Augmented Reality)浅谈
  4. HSI颜色空间及其应用
  5. 十大开源安卓应用程序的开发框架
  6. 影响数千万APP的安卓APP“寄生兽”漏洞技术分析
  7. 深拷贝与浅拷贝、空类与空数组
  8. Spring MVC 向页面传值-Map、Model和ModelMap
  9. linux服务之nagios
  10. VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零