博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习多线程 造成线程不同步的原因 数组实现简单的栈 三
阅读量:4179 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
通用分页类 (asp.net C#)
查看>>
数字分页导航条 (asp.net C#)
查看>>
中华唐氏小湾族2010年人口统计
查看>>
全国省市数据库
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
一道关于员工与部门查询的SQL笔试题
查看>>
VFP的页面工具栏显示问题
查看>>
java事物处理
查看>>
Java批处理
查看>>
Java大数据
查看>>
程序员励志名言
查看>>
Java SWT事件
查看>>
JavaScript基础1
查看>>
JavaScript事件
查看>>
JavaScript正则表达式
查看>>
JavaScript对象和数组
查看>>
JavaScript 时间与日期
查看>>
JavaScript Function类型
查看>>
JavaScript 变量 作用域 内存
查看>>
JavaScript基本包装类型
查看>>