学习多线程 造成线程不同步的原因 数组实现简单的栈 三
程序员文章站
2022-06-19 11:49:15
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();//...
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(入栈)线程先启动
线程同步:
当多线程并发访问临界资源(同一个对象)时,多线程同时访问同一个对象时,如果破坏了
原子操作(不可分割的操作),就会造成数据不一致。和数据库中的事务类似。
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!
欢迎加入技术群聊!
本文地址:https://blog.csdn.net/taiguolaotu/article/details/107631044
上一篇: seo外链工具对于网站关键词排名影响
下一篇: iOS 多线程安全方案