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 锁的概念。对两个线程执行的两个方法同时加锁,因此两线程访问同一 对象时,需要都拿到该对象的锁标记才能执行各自方法。
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!
欢迎加入技术群聊!

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