博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重入锁,非公平,公平,读写锁
阅读量:5937 次
发布时间:2019-06-19

本文共 6695 字,大约阅读时间需要 22 分钟。

重入锁
package com.thread.demo.safe.lock;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 重入锁 *  * @author Administrator * */public class LockDemo1 {    private static int count;    private static Lock lock = new ReentrantLock();    public static void main(String[] args) throws Exception {        Thread t1 = new Thread(new MyRunnable(), "AAA");        Thread t2 = new Thread(new MyRunnable(), "BBB");        t2.start();        Thread.sleep(2000);        t1.start();                t1.join();        t2.join();        System.out.println("最终结果为:" + count);    }    static class MyRunnable implements Runnable {        public void increase() {            // 加锁            lock.lock();            try {                count++;                System.out.println(Thread.currentThread().getName() + "计算中....");                Thread.sleep(4000);// 模拟操作耗时                System.out.println(Thread.currentThread().getName() + "计算完成...");                // throw new RuntimeException();            } catch (NumberFormatException e) {                e.printStackTrace();            } catch (Exception e) {                e.printStackTrace();            } finally {                // 解锁                lock.unlock();            }        }        public void increase1() {            if (lock.tryLock()) {                try {                    count++;                    //System.out.println(Thread.currentThread().getName() + "计算中....");                    Thread.sleep(1000);// 模拟操作耗时                    System.out.println(Thread.currentThread().getName() + "计算完成...");                } catch (NumberFormatException e) {                    e.printStackTrace();                } catch (Exception e) {                    e.printStackTrace();                } finally {                    // 解锁                    lock.unlock();                }            } else {                System.out.println(Thread.currentThread().getName());                try {                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }        public void run() {            for (int i = 0; i < 10; i++) {                increase1();            }        }    }}
读写锁
package com.thread.demo.safe.lock;import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;class ReadWrite {    /* 共享数据,只能一个线程写数据,可以多个线程读数据 */    private Object data = null;    /* 创建一个读写锁 */    ReadWriteLock rwlock = new ReentrantReadWriteLock();     /**     * 读数据,可以多个线程同时读, 所以上读锁即可     */    public void get() {         /* 上读锁 */         rwlock.readLock().lock();          try {             System.out.println(Thread.currentThread().getName() + " 准备读数据!");             /* 休眠 */             Thread.sleep((long) (Math.random() * 1000));             System.out.println(Thread.currentThread().getName() + "读出的数据为 :" + data);         } catch (InterruptedException e) {             e.printStackTrace();         } finally {             rwlock.readLock().unlock();         }    }     /**     * 写数据,多个线程不能同时 写 所以必须上写锁     *      * @param data     */    public void put(Object data) {          /* 上写锁 */         rwlock.writeLock().lock();          try {             System.out.println(Thread.currentThread().getName() + " 准备写数据!");             /* 休眠 */             Thread.sleep((long) (Math.random() * 1000));             this.data = data;             System.out.println(Thread.currentThread().getName() + " 写入的数据: " + data);          } catch (Exception e) {             e.printStackTrace();         } finally {             rwlock.writeLock().unlock();         }    }} /** * 测试类 *  */public class ReadWriteLockDemo {     public static void main(String[] args) {          /* 创建ReadWrite对象 */         final ReadWrite readWrite = new ReadWrite();          /* 创建并启动3个读线程 */         for (int i = 0; i < 3; i++) {             new Thread(new Runnable() {                  @Override                 public void run() {                      readWrite.get();                  }             },"AAA"+i).start();                          /*创建3个写线程*/             new Thread(new Runnable() {                                  @Override                 public void run() {                      /*随机写入一个数*/                      readWrite.put(new Random().nextInt(8));                                       }             },"BBB"+i).start();         }             } }
读写锁的实例(缓存)
package com.thread.demo.safe.lock;import java.util.Collections;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * 读写锁的实例 *  * @author Administrator * */public class CacheDemo {    // 创建一个缓存对象    static Map
cache = Collections.synchronizedMap(new HashMap<>()); static ReadWriteLock rwLock = new ReentrantReadWriteLock(); /** * 定义一个获取数据的方法 */ public Object getData(String key) { // 开启读锁 rwLock.readLock().lock(); Object value = null; try { // 获取到缓冲对象中数据 value = cache.get(key); if (value == null) { // 关闭读锁 rwLock.readLock().unlock(); // 开启写锁 rwLock.writeLock().lock(); try { value = cache.get(key); // 再次判断是为空 if (value == null) { // 把数据存储到缓存中 System.out.println("从db获取数据"+key); cache.put(key, "key的值"); } } finally { // 释放写锁 rwLock.writeLock().unlock(); } // 打开读锁 rwLock.readLock().lock(); } System.out.println("从缓存获取"); value = cache.get(key); } finally { // 关闭读锁 rwLock.readLock().unlock(); } return value; } static class CacheRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName()); System.out.println(new CacheDemo().getData(i+"")); } } } public static void main(String[] args) { // 放入数据 //cache.put("1", "1111"); //cache.put("2", 22222); for ( int i = 0; i < 3; i++) { new Thread(new CacheRunnable(),"AAA"+i).start(); } }}

 

转载于:https://www.cnblogs.com/sunBinary/p/10588763.html

你可能感兴趣的文章
jQuery操作table tr td
查看>>
工作总结:MFC自写排序算法(升序)
查看>>
螺旋队列问题之二
查看>>
扩展运算符和解构赋值的理解
查看>>
后缀数组(suffix array)详解
查看>>
手机H5显示一像素的细线
查看>>
Menu 菜单栏
查看>>
Integer跟int的区别(备份回忆)
查看>>
集合解析
查看>>
详解分布式应用程序协调服务Zookeeper
查看>>
软件工程之构建之法
查看>>
UVa 10902
查看>>
Mathf.Sin正弦
查看>>
禁止浏览器缓存js
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
java中string和int互相转化
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
新学期的合作
查看>>
Python_练习题_49
查看>>