实例演示:Java多线程编程的同步问题

原创 深碍√TFBOYSˉ_ 2024-12-13 23:24 83阅读 0赞

在Java中,多线程编程中的同步问题是由于共享资源的存在,当多个线程同时访问这些资源时,可能会引发竞态条件、死锁等问题。

这里以简单的生产者消费者模型为例,演示同步问题:

  1. // 定义共享资源
  2. class Buffer {
  3. int[] list = new int[10];
  4. boolean empty = true;
  5. // 添加元素到列表尾部
  6. void add(int num) {
  7. if (empty) {
  8. list[0] = num;
  9. empty = false;
  10. notifyAll(); // 通知所有等待的线程
  11. } else {
  12. list[empty--] = num;
  13. }
  14. }
  15. // 获取并移除列表头部元素
  16. int remove() {
  17. if (!empty) {
  18. throw new IllegalStateException("Buffer is empty");
  19. }
  20. int num = list[0];
  21. list[0] = 0; // 清空位置
  22. empty = true;
  23. notifyAll(); // 通知所有等待的线程
  24. return num;
  25. }
  26. }
  27. // 生产者线程
  28. class ProducerThread implements Runnable {
  29. private Buffer buffer;
  30. public ProducerThread(Buffer buffer) {
  31. this.buffer = buffer;
  32. }
  33. @Override
  34. public void run() {
  35. while (true) { // 模拟生产过程
  36. buffer.add(10 + Math.random()));
  37. try {
  38. Thread.sleep(50); // 暂停50毫秒
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }
  45. // 消费者线程
  46. class ConsumerThread implements Runnable {
  47. private Buffer buffer;
  48. public ConsumerThread(Buffer buffer) {
  49. this.buffer = buffer;
  50. }
  51. @Override
  52. public void run() {
  53. while (true) { // 模拟消费过程
  54. int num = buffer.remove(); // 获取并移除列表头部元素
  55. if (num != 10 + Math.random()) {
  56. System.out.println("Error: Consumed number does not match expected");
  57. } else {
  58. System.out.println("Consumed number: " + num);
  59. }
  60. try {
  61. Thread.sleep(50); // 暂停50毫秒
  62. } catch (InterruptedException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. }
  68. // 主程序
  69. public class Main {
  70. public static void main(String[] args) {
  71. Buffer buffer = new Buffer();
  72. // 创建生产者和消费者线程
  73. Thread producerThread = new Thread(new ProducerThread(buffer)));
  74. Thread consumerThread = new Thread(new ConsumerThread(buffer)));
  75. // 启动线程
  76. producerThread.start();
  77. consumerThread.start();
  78. // 等待所有线程执行完毕
  79. try {
  80. producerThread.join();
  81. consumerThread.join();
  82. } catch (InterruptedException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }

这个程序中,Buffer类代表一个共享资源。生产者和消费者线程同时访问并修改这个资源。

当多个线程尝试同时对同一个资源进行操作时,就可能出现同步问题,例如数据不一致、死锁等。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读