本文共 1769 字,大约阅读时间需要 5 分钟。
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 锁的概念。对两个线程执行的两个方法同时加锁,因此两线程访问同一对象时,需要都拿到该对象的锁标记才能执行各自方法。
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!
欢迎加入技术群聊!
转载地址:http://jkoai.baihongyu.com/