歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java多線程之並發鎖

Java多線程之並發鎖

日期:2017/3/1 10:26:16   编辑:Linux編程

這是自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. }
Copyright © Linux教程網 All Rights Reserved