2025年学习多线程 造成线程不同步的原因 数组实现简单的栈 三

学习多线程 造成线程不同步的原因 数组实现简单的栈 三java 代码 package com baigu demo1 stack public class TestStack public static void main String args throws InterruptedE Stack stack new Stack stack print

大家好,我是讯享网,很高兴认识大家。

java代码

package com.baigu.demo1.stack; public class TestStack { public static void main(String[] args) throws InterruptedException { Stack stack = new Stack(); // stack.print(); // stack.posh('C'); // stack.print(); // stack.pop(); // stack.print(); PushThread t1 = new PushThread(stack); PopThread t2 = new PopThread(stack); stack.print(); System.out.println(); t1.start(); t2.start(); Thread.sleep(1000); //睡一秒让t1 t2线程执行结束在执行主线程 stack.print(); } } class Stack{ private char[] data={'A','B',' ',' ',' ',' ',' ',' '}; private int index=2; //记录数组中有效元素的个数 public void posh(char c){ System.out.println(c+" poshed! 入栈"); data[index]=c; // try { // Thread.sleep(100); //睡0.1秒类似于时间片到期 // } catch (InterruptedException e) { // e.printStackTrace(); // } index++; } public void pop(){ index --; System.out.println(data[index]+" poped! 出栈"); data[index]=' '; } public void print(){ for (char s:data) System.out.print(s); } } class PushThread extends Thread{ Stack s; public PushThread(Stack s) { this.s = s; } @Override public void run() { s.posh('C'); } } class PopThread extends Thread{ Stack s; public PopThread(Stack s) { this.s = s; } @Override public void run() { s.pop(); } } 

讯享网

运行结果
在这里插入图片描述
讯享网
结果分析原因
正确流程
t1(入栈)线程先启动
在这里插入图片描述
错误流程
t1(入栈)线程先启动

在这里插入图片描述

讯享网线程同步: 当多线程并发访问临界资源(同一个对象)时,多线程同时访问同一个对象时,如果破坏了 原子操作(不可分割的操作),就会造成数据不一致。和数据库中的事务类似。 一个线程访问了一个对象的方法,该方法没有执行完毕,另一个线程便执行了该对象的另 一个方法,两个方法操作的是同一个数据,所以会造成数据不一致。如何解决,便引入 了synchronized 锁的概念。对两个线程执行的两个方法同时加锁,因此两线程访问同一 对象时,需要都拿到该对象的锁标记才能执行各自方法。 

这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!

欢迎加入技术群聊!
在这里插入图片描述

小讯
上一篇 2025-01-14 10:41
下一篇 2025-04-02 11:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/16908.html