自由发挥,多写写,多探讨探讨新的思路;一些题在目前有很多种解法,各种思路、各种锁

  1. 这种办法也不完善:因为t1线程release之后不一定是t2线程acquire到,而是有可能还是t1线程acquire到
  2. 还得结合wait、notify或者await、signal或者CountDownLatch
  3. 用join规定两线程之间的执行顺序???—->这不就变成单线程顺序执行了吗
  4. 让t2线程join到t1线程中去
  5. 还有个问题:就是线程启动start的时候是t2先启动,先拿到semaphore的,t2会先执行完;之后才会去执行t1
  6. t2线程在t1里面start,然后join—->让t1控制t2,然后join,也可以
  7. semaphore+join也可以
  1. package com.mashibing.juc.c_020_01_Interview;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.Semaphore;
  5. import java.util.concurrent.locks.LockSupport;
  6. public class T08_Semaphore {
  7. // 添加volatile,使t2能够得到通知
  8. volatile List lists = new ArrayList();
  9. public void add(Object o) {
  10. lists.add(o);
  11. }
  12. public int size() {
  13. return lists.size();
  14. }
  15. static Thread t1 = null, t2 = null;
  16. public static void main(String[] args) {
  17. T08_Semaphore c = new T08_Semaphore();
  18. Semaphore s = new Semaphore(1);
  19. t1 = new Thread(() -> {
  20. try {
  21. s.acquire();
  22. for (int i = 0; i < 5; i++) {
  23. c.add(new Object());
  24. System.out.println("add " + i);
  25. }
  26. s.release();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. try {
  31. t2.start();
  32. t2.join();
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. try {
  37. s.acquire();
  38. for (int i = 5; i < 10; i++) {
  39. System.out.println(i);
  40. }
  41. s.release();
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. }, "t1");
  46. t2 = new Thread(() -> {
  47. try {
  48. s.acquire();
  49. System.out.println("t2 结束");
  50. s.release();
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. }, "t2");
  55. //t2.start();
  56. t1.start();
  57. }
  58. }


1A2B3C……问题—->linux编程上的一个作业

image.png

  • 用semaphore应该可以写
  • 但不能用join了