Java核心知识点学习-线程中如何创建锁和使用锁Lock设计一个缓存系统.doc_第1页
Java核心知识点学习-线程中如何创建锁和使用锁Lock设计一个缓存系统.doc_第2页
Java核心知识点学习-线程中如何创建锁和使用锁Lock设计一个缓存系统.doc_第3页
Java核心知识点学习-线程中如何创建锁和使用锁Lock设计一个缓存系统.doc_第4页
Java核心知识点学习-线程中如何创建锁和使用锁Lock设计一个缓存系统.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的.1.如何创建锁?Lock lock = new ReentrantLock();2.如何使用锁?可以参看Lock文档,其使用格式如下:class X private final ReentrantLock lock = new ReentrantLock(); / . public void m() lock.lock(); / block until condition holds try / . 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_ * 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) / 休息10ms try 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 cache = new HashMap(); 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 lock Object 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中把锁打开,不管程序是否执行成功,因为如果不解锁,那么程序将会产生死锁,关于死锁,将在接下来的文章中介绍.java核心知识点学习-多线程并发之线程同步1.什么是线程同步?多线程编程是很有趣的事情,它很容易出现错误情况,这种情况不是由编码造成的,它是由系统的线程调度造成的,当使用多个线程来访问同一个数据时,很容易出现偶然情况,出现线程安全问题.线程安全问题最常见的就是银行取钱问题,铁路售票问题,必须保证甲方在操作数据时候,己方不会影响甲方.类似于公共厕所,一个人占一个坑.2.下面的例子,将说明为什么要保证线程安全?package com.amos.concurrent;/* * ClassName: ThreadSynchronizedTest * Description: 多线程并发之线程同步* author: amosli* email:hi_* date Apr 20, 2014 2:44:29 PM */public class ThreadSynchronizedTest public static void main(String args) new ThreadSynchronizedTest().init(); private void init() final OutPuter outPuter = new OutPuter(); /新建一个线程A new Thread(new Runnable() public void run() while (true) /休息10ms try Thread.sleep(10); catch (InterruptedException e) e.printStackTrace(); outPuter.output(hi_amos);/输出 ).start(); /线程B new Thread(new Runnable() public void run() while (true) try Thread.sleep(10); catch (InterruptedException e) e.printStackTrace(); outPuter.output(amosli); ).start(); class OutPuter /输出name,逐个字节读取,并输出 public void output(String name) int length = name.length(); synchronized (name) for (int i = 0; i length; i+) System.out.print(name.charAt(i); System.out.println(); 输出结果如下图所示:在多次执行上面的代码后就会发现出现问题了,这是因为线程A和线程B在执行output方法时,系统调度出现了问题,导致了上面的问题,这种情况出现的概率相对较小,但这种小概率的事件也是要解决的.下面将介绍如何解决这种问题.3.解决方法1-同步代码块只需要将上面的方法加上synchronized关键字即可public void output2(String name) int length = name.length(); synchronized (this) for (int i = 0; i length; i+) System.out.print(name.charAt(i); System.out.println(); 在要多次访问的代码块前加上synchronized关键字,即表示加上排队系统,线程A只有等线程B执行完了才能访问同一个代码块.这里要注意this,this表示的是当前对象,这里this也可以用Outputer.class代替.4.解决方法2-同步方法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(); 同步方法,即是在要多次访问的方法前面加上synchronized关键字.注意:1.synchronized关键字可以修饰方法,代码块,但不能修饰构造器,属性等;2.同时synchronized关键字最好一个方法中只用一次,否则可能造成死锁.3.任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定.上面的代码可以改写如下:package com.amos.concurrent;/* * ClassName: ThreadSynchronizedTest * Description: 多线程并发之线程安全* author: amosli* email:hi_* date Apr 20, 2014 2:44:29 PM */public class ThreadSynchronizedTest public static void main(String args) new ThreadSynchronizedTest().init(); private void init() final OutPuter outPuter = new OutPuter(); /新建一个线程 new Thread(new Runnable() public void run() while (true) /休息10ms try 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 /输出name,逐个字节读取,并输出 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(); public void output2(String name) int length = name.length

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论