JavaScript数据结构——栈的实现

  栈(stack)是一种运算受限的线性表。栈内的元素只允许通过列表的一端访问,这一端被称为栈顶,相对地,把另一端称为栈底。装羽毛球的盒子是现实中常见的栈例子。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。   下图演示了入栈和出栈的过程:      我们知道pop()方法虽然可以访问栈顶元素,但是调用该方法后,栈顶元素被删除,而peek()方法返回栈顶元素,并不改变栈。push(),pop(),peek()是实现栈的三个主要方法,下表定义了栈的主要方法: 主要方法及属性 dataStorage Array 存储数据的底层数据结构 top int 记录栈顶元素位置 push fucntion 入栈方法 pop fucntion 出栈方法 peek fucntion 返回栈顶元素 length     fucntion   返回栈内元素个数 clear function  … Read More »JavaScript数据结构——栈的实现

多线程等待唤醒机制之生产消费者模式

  上篇楼主说明了多线程中死锁产生的原因并抛出问题——死锁的解放方案,那么在本篇文章,楼主将引用一个KFC生产汉堡,顾客购买汉堡的过程来说明死锁解决方案及多线程的等待唤醒机制。 简单地用一幅图来说明KFC生产汉堡,顾客来消费的过程: 场景分析: 资源类:Hamburger    设置汉堡数据:SetThread(生产者) 获取汉堡数据:GetThread(消费者) 测试类:HamburgerTest 不同种类的线程(生产者、消费者)针对同一资源(汉堡)的操作 当汉堡有存货的时候,汉堡师傅不再生产,顾客可消费;反之,汉堡师傅生产,顾客不可消费 是否有线程安全问题?当然。楼主在《线程安全问题》那篇文章给出了判定方式,在该场景全部满足。 代码构建:类里面的i属性是楼主为了效果好一些特意加的,与本文要说明的问题无关;   首先是资源类Hamburger.java,楼主这里为了模拟只简单的构造了3个字段,其中flag用来表示资源是否有数据。 1 package com.jon.hamburger; 2 3 public class Hamburger { 4 private String name;//汉堡名称… Read More »多线程等待唤醒机制之生产消费者模式

多线程之死锁产生

本篇楼主接着上篇多线程的安全问题继续讨论多线程的死锁问题。 我们可以构造这样一种场景:传统(理想)情况下,楼主吃饭必须用两支筷子,而楼主老板(美国人)吃饭必须要用一刀,一叉;现在,楼主手上有一支筷子和一把刀,老板手上有一支筷子和一把叉;当我们都在互相等待对方把餐具给我们时,出现相互等待的现象,都吃不了饭,从而形成死锁。 所以上篇所说到的解决多线程同步的安全问题又衍生出了:如果出现同步嵌套,就容易产生死锁的问题。上面的场景我们先用代码来实现看一看。 构建MyLock类,创建楼主,老板两个锁对象: 1 package com.jon.dielock; 2 3 public class MyLock{ 4 //创建2把所对象 5 public static final Object objA = new Object(); 6 public… Read More »多线程之死锁产生

线程安全问题

本文楼主主要以用户在售票厅购买车票为背景进行多线程的实现。假设A市到B市的车票共50张,共有3个售票窗口在进行售票,使用多线程来模拟理想情况下的用户购票: 实现Runnable的Ticket类: 1 package com.jon.thread; 2 3 public class TicketSell implements Runnable { 4 private int tickets = 50;//设置车票数量 5 @Override 6 public void run()… Read More »线程安全问题

Bean复制

有的时候我们需要将一个bean的属性赋值到另一个bean的属性中,比如用户提交过来的表单bean需要将该bean中的属性值赋值到对应的数据库bean,我们通常会以这样的方式做: 1 User user = new User("1", "Jon_China", "123456", "1992-11-17", "127.0.0.1"); 2 TargetUser target = new TargetUser(); 3 target.setId(user.getId()); 4 target.setUserName(user.getUserName()); 5 target.setPassword(user.getPassword()); 当bean的属性过多时是不是感觉“嘿打脑壳”。不要紧,Apache提供bean的copy工具BeanUtil.  当然是用也是比较简单的,楼主一步一步说明:… Read More »Bean复制

java中的ConcurrentModificationException异常

先看这样一段代码: List list = new ArrayList(); list.add("1"); list.add("2"); for (String temp : list) { if("1".equals(temp)){   list.remove(temp); } } 这是对一个集合进行简单迭代,当集合中的某一个元素与“1”相等则移除该元素,程序运行正常;此时我们把“1”换成“2”: List list = new ArrayList(); list.add("1");… Read More »java中的ConcurrentModificationException异常

C#中判断字符串相等的方法

可以使用如下方式: 1. String.Compare(str1, str2) == 0  或者  str1.CompareTo(str2) == 0 2. str1.Equals(str2)  或者 String.Equals(str1, str2) 这种方式的话,需要注意null的情况