在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java多线程编程中线程锁与读写锁的使用示例

2016-7-29 15:37| 发布者: zhangjf| 查看: 665| 评论: 0

摘要: 线程锁Lock Lock 相当于 当前对象的 Synchronized import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * Lock lock = new ReentrantLock(); * lock.lock(); lock.un ...

线程锁Lock
Lock 相当于 当前对象的 Synchronized

  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. /*
  4. * Lock lock = new ReentrantLock();
  5. * lock.lock(); lock.unLock();
  6. * 类似于 synchronized,但不能与synchronized 混用
  7. */
  8. public class LockTest {
  9. public static void main(String[] args) {
  10. final Outer outer = new LockTest().new Outer();
  11. new Thread(new Runnable() {
  12. @Override
  13. public void run() {
  14. // TODO Auto-generated method stub
  15. while (true) {
  16. outer.out1("zhangxiaoxiao");
  17. outer.out2("lihuoming");
  18. }
  19. }
  20. }).start();
  21. new Thread(new Runnable() {
  22. @Override
  23. public void run() {
  24. // TODO Auto-generated method stub
  25. while (true) {
  26. outer.out1("zhangxiaoxiao");
  27. outer.out2("lihuoming");
  28. }
  29. }
  30. }).start();
  31. }
  32. class Outer {
  33. Lock lock = new ReentrantLock();
  34. void out1(String name) {
  35. lock.lock();
  36. int len = name.length();
  37. for (int i = 0; i < len; i++) {
  38. System.out.print(name.charAt(i));
  39. }
  40. System.out.println();
  41. lock.unlock();
  42. }
  43. void out2(String name) {
  44. lock.lock();
  45. int len = name.length();
  46. for (int i = 0; i < len; i++) {
  47. System.out.print(name.charAt(i));
  48. }
  49. System.out.println();
  50. lock.unlock();
  51. }
  52. }
  53. }
复制代码


读写锁 ReentrantReadWriteLock

读写锁:允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.concurrent.locks.ReadWriteLock;
  4. import java.util.concurrent.locks.ReentrantReadWriteLock;
  5. /*
  6. * 问题:设计一个 缓存机制 的 伪代码
  7. * 从集合中读取数据,读取不到,就写入,再考虑多线程并发的情况
  8. */
  9. public class ReadWriteLockTest2 {
  10. private Map<String, Object> data = new HashMap<String, Object>();
  11. private ReadWriteLock lock = new ReentrantReadWriteLock();
  12. //读写锁
  13. public Object getInstance1(String key, Object obj) {
  14. lock.readLock().lock();
  15. Object value = null;
  16. try {
  17. value = data.get(key);
  18. if (value == null) {//一条线程进入这里,
  19. lock.readLock().unlock();//读锁解了,其他线程就可能也到这了
  20. lock.writeLock().lock();//只能有一条线程到这,写锁开启,要写入数据了
  21. if (data.get(key) == null) {
  22. value = obj;
  23. /*先判断数据,如果不存在,才写入,,因为 界时当写锁解除后,其他
  24. 线程,再想写入时, 判断到数据存在 ,就跳过了。就不会发生同时写入的情况
  25. */
  26. data.put(key, value);
  27. }
  28. lock.writeLock().unlock();//写完了,解锁
  29. lock.readLock().lock();
  30. }
  31. } finally {
  32. lock.readLock().unlock();
  33. }
  34. return value;
  35. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 10:00

Copyright 2015-2025 djqfx

返回顶部