Condition类的await()、signal()和signalAll()相当于 Object 的 wait()、notify()和notifyAll()

    当Lock锁使用公平模式的时候,可以使用Condition的signal(),线程会按照FIFO的顺序冲await()中唤醒

    我们根据结果可知,abcd的顺序并不是有序的,如果我们想让线程有序,必须用多个Condition条件来实现

    1. import java.util.concurrent.locks.Condition;
    2. import java.util.concurrent.locks.Lock;
    3. import java.util.concurrent.locks.ReentrantLock;
    4. public class B {
    5. public static void main(String[] args) {
    6. Data2 data = new Data2();
    7. new Thread(()->{
    8. for (int i = 0; i < 10; i++) {
    9. try {
    10. data.increment();
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. },"A").start();
    16. new Thread(()->{
    17. for (int i = 0; i < 10; i++) {
    18. try {
    19. data.decrement();
    20. } catch (InterruptedException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. },"B").start();
    25. new Thread(()->{
    26. for (int i = 0; i < 10; i++) {
    27. try {
    28. data.increment();
    29. } catch (InterruptedException e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. },"C").start();
    34. new Thread(()->{
    35. for (int i = 0; i < 10; i++) {
    36. try {
    37. data.decrement();
    38. } catch (InterruptedException e) {
    39. e.printStackTrace();
    40. }
    41. }
    42. },"D").start();
    43. }
    44. }
    45. // 判断等待,业务,通知
    46. class Data2{ // 数字 资源类
    47. private int number = 0;
    48. Lock lock = new ReentrantLock();
    49. Condition condition = lock.newCondition();
    50. //condition.await(); // 等待
    51. //condition.signalAll(); // 唤醒全部
    52. //+1
    53. public void increment() throws InterruptedException {
    54. lock.lock();
    55. try {
    56. // 业务代码
    57. while (number!=0){ //0
    58. // 等待
    59. condition.await();
    60. }
    61. number++;
    62. System.out.println(Thread.currentThread().getName()+"=>"+number);
    63. // 通知其他线程,我+1完毕了
    64. condition.signalAll();
    65. } catch (Exception e) {
    66. e.printStackTrace();
    67. } finally {
    68. lock.unlock();
    69. }
    70. }
    71. //-1
    72. public void decrement() throws InterruptedException {
    73. lock.lock();
    74. try {
    75. while (number==0){ // 1
    76. // 等待
    77. condition.await();
    78. }
    79. number--;
    80. System.out.println(Thread.currentThread().getName()+"=>"+number);
    81. // 通知其他线程,我-1完毕了
    82. condition.signalAll();
    83. } catch (Exception e) {
    84. e.printStackTrace();
    85. } finally {
    86. lock.unlock();
    87. }
    88. }
    89. }
    1. A=>1
    2. B=>0
    3. A=>1
    4. B=>0
    5. A=>1
    6. B=>0
    7. A=>1
    8. B=>0
    9. A=>1
    10. B=>0
    11. A=>1
    12. D=>0
    13. A=>1
    14. D=>0
    15. A=>1
    16. D=>0
    17. A=>1
    18. D=>0
    19. A=>1
    20. D=>0
    21. C=>1
    22. D=>0
    23. C=>1
    24. D=>0
    25. C=>1
    26. D=>0
    27. C=>1
    28. D=>0
    29. C=>1
    30. D=>0
    31. C=>1
    32. B=>0
    33. C=>1
    34. B=>0
    35. C=>1
    36. B=>0
    37. C=>1
    38. B=>0
    39. C=>1
    40. B=>0