Java多线程之并发锁

Wesley13
• 阅读 626

这是自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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这