Java多线程之并发锁

这是自JDK5.0开始提供的Java并发包里面的类

下面是关于Java并发锁的测试代码

  1. package com.jadyer.thread.lock;  

  2. import java.util.concurrent.locks.Lock;  

  3. import java.util.concurrent.locks.ReentrantLock;  

  4. /** 

  5. * LockTest 

  6. * @author 宏宇 

  7. * @create Mar 1, 2012 7:12:04 PM 

  8. */  

  9. public class LockTest {  

  10.     public static void main(String[] args) {  

  11.         FoodCenter fc = new FoodCenter();  

  12.         new Thread(new ThreadDog(fc, "It is dog`s food")).start();  

  13.         new Thread(new ThreadPig(fc, "It is pig`s food")).start();  

  14.     }  

  15. }  

  16. class ThreadDog implements Runnable{  

  17.     private FoodCenter fc;  

  18.     private String foodname;  

  19.     public ThreadDog(FoodCenter fc, String foodname){  

  20.         this.fc = fc;  

  21.         this.foodname = foodname;  

  22.     }  

  23.     @Override  

  24.     public void run() {  

  25.         while(true){  

  26.             try {  

  27.                 Thread.sleep(1000);  

  28.             } catch (InterruptedException e) {  

  29.                 e.printStackTrace();  

  30.             }  

  31.             fc.getFood(foodname);  

  32.         }  

  33.     }  

  34. }  

  35. class ThreadPig implements Runnable{  

  36.     private FoodCenter fc;  

  37.     private String foodname;  

  38.     public ThreadPig(FoodCenter fc, String foodname){  

  39.         this.fc = fc;  

  40.         this.foodname = foodname;  

  41.     }  

  42.     @Override  

  43.     public void run() {  

  44.         while(true){  

  45.             try {  

  46.                 Thread.sleep(2000);  

  47.             } catch (InterruptedException e) {  

  48.                 e.printStackTrace();  

  49.             }  

  50.             fc.getFood(foodname);  

  51.         }  

  52.     }  

  53. }  

  54. /** 

  55. * @see ========================================================================================= 

  56. * @see java.util.concurrent是JDK5.0开始提供的Java并发包,其子包locks是专门用于处理线程锁的 

  57. * @see java.util.concurrent.locks.Lock较synchronized关键字比,有一个最大的区别,那就是 

  58. * @see Lock可以比synchronized更细粒度的控制锁,体现在try{...}finally{mylock.unlock();} 

  59. * @see ========================================================================================= 

  60. * @see Lock有点像公共厕所的门闩,只有正在使用厕所的人,把门闩打开出来了,其它人才可以使用公厕 

  61. * @see Lock比传统线程模型中的synchronized方式更加面向对象。与生活中的锁类似,锁本身也应该是一个对象 

  62. * @see 两个线程执行的代码片段要实现同步互斥的效果,那么这两个线程所使用的必须是同一个Lock对象 

  63. * @see 并且,锁应该位于待操作的资源类的内部方法中,而非线程代码中 

  64. * @see ========================================================================================= 

  65. */  

  66. class FoodCenter {  

  67.     Lock mylock = new ReentrantLock(); //创建一个锁   

  68.     public void getFood(String name) {  

  69.         int len = name.length();  

  70.         mylock.lock(); //上锁   

  71.         try {  

  72.             for (int i = 0; i < len; i++) {  

  73.                 System.out.print(name.charAt(i));  

  74.             }  

  75.             System.out.println();  

  76.         } finally {  

  77.             mylock.unlock(); //解锁   

  78.         }  

  79.     }  

  80. }  

下面是关于Java读写锁的测试代码

  1. package com.jadyer.thread.lock;  

  2. import java.util.concurrent.locks.ReadWriteLock;  

  3. import java.util.concurrent.locks.ReentrantReadWriteLock;  

  4. /** 

  5. * Java读写锁 

  6. * @see 锁分为读锁和写锁。多个读锁不互斥。读锁与写锁互斥。写锁与写锁互斥。这是由JVM自己控制的 

  7. * @see 如果代码只读数据,可以很多人同时读,但不能同时写,那就上读锁 

  8. * @see 如果代码修改数据,并且不允许同时读,只能一个人写,那就上写锁 

  9. * @see 总之:读的时候上读锁,写的时候上写锁 

  10. */  

  11. public class ReadWriteLockDemo{  

  12.     private Object myData = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据   

  13.     ReadWriteLock rwl = new ReentrantReadWriteLock();  

  14.     public void get() {  

  15.         rwl.readLock().lock(); //读锁   

  16.         try {  

  17.             System.out.println(Thread.currentThread().getName() + " be ready to read data");  

  18.             Thread.sleep((long) (Math.random() * 1000));  

  19.             System.out.println(Thread.currentThread().getName() + " have read data : " + myData);  

  20.         } catch (InterruptedException e) {  

  21.             e.printStackTrace();  

  22.         } finally {  

  23.             rwl.readLock().unlock();  

  24.         }  

  25.     }  

  26.     public void put(Object data) {  

  27.         rwl.writeLock().lock(); //写锁   

  28.         try {  

  29.             System.out.println(Thread.currentThread().getName() + " be ready to write data");  

  30.             Thread.sleep((long) (Math.random() * 1000));  

  31.             this.myData = data;  

  32.             System.out.println(Thread.currentThread().getName() + " have write data : " + myData);  

  33.         } catch (InterruptedException e) {  

  34.             e.printStackTrace();  

  35.         } finally {  

  36.             rwl.writeLock().unlock();  

  37.         }  

  38.     }  

  39. }  

$(document).ready(function(){dp.SyntaxHighlighter.HighlightAll('code');});
原文链接: http://blog.csdn.net/hopezhangbo/article/details/7383799

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java爬虫之JSoup使用教程

title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin