`
wen742538485
  • 浏览: 228529 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Thread.sleep 会让 synchronized 放弃得到的锁吗?

    博客分类:
  • java
阅读更多
想验证一下多线程下数据共享出错的问题,在下面的程序中定义了一个简单的堆栈,并且两个线程向堆栈中压入数据和弹出数据。为了让它出错,在 MyStack 类中,当数据存入到数组之后,指针修改之前调用了 Thread.sleep 方法使之休眠。但后来将这一段代码加上同步锁之后,似乎没起到同步的作用啊

代码如下:

package nit.thread;

class MyStack{
private int[] data = new int[10];
private int p = 0;
public void push(int value){
synchronized(this){
data[p] = value;
System.out.print("正在向位置 " + p + " 压入数据: " + value);
try{
Thread.sleep(100);
}catch(Exception ex){}
p++;
System.out.println(" 压入数据完成");
}
}
public int[] pop(){
p--;
return new int[]{data[p-1], p};
}
}

class PushThread extends Thread{
private MyStack stack;
PushThread(MyStack stack){
this.stack = stack;
}
public void run(){
stack.push(100);
}
}

class PopThread extends Thread{
private MyStack stack;
PopThread(MyStack stack){
this.stack = stack;
}
public void run(){
System.out.println(" 取出数据,top = " + stack.pop()[1] + " 完成");
}
}
public class TestStack {
public static void main(String[] args){
MyStack stack = new MyStack();
stack.push(10);
stack.push(20);

PushThread t1 = new PushThread(stack);
PopThread t2 = new PopThread(stack);
t1.start();
t2.start();
}
}




----------------------------------------------------------------------

synchronized(this)只锁语句块

不锁对象本身

--------------------------------------------------------

public int[] pop(){
p--;
return new int[]{data[p-1], p};
}

p--就不需要同步了么?

分享到:
评论

相关推荐

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    jvm线程生命周期以及线程的状态切换,探究sleep和唤醒的原理。

    java核心知识点整理.pdf

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM .........................

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

    Java:synchronized锁住的是代码还是对象

    在Java中,synchronized关键字是用来控制线程同步的,是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。Synchronized既可以对代码块使用,也...  Thread.sleep(1000);  } catch (InterruptedExce

    高级开发并发面试题和答案.pdf

    Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会...

    java聊天室源程序

    最近两周闲的无聊,课题也不想做了,就写了一个聊天室程序,放在实验室让大家玩玩,代码如下,分为客户端和服务器端。希望大家多给点意见 服务器端: 1 BroadCast.java package server; import java.io.*; ...

    并发编程面试专题.pdf

    3)在 java 中 wait 和 sleep 方法的不同? 4)用 Java 实现阻塞队列。 5)用 Java 写代码来解决生产者——消费者问题。 6)用 Java 编程一个会导致死锁的程序,你将怎么解决? 7) 什么是原子操作,Java 中的原子操作...

    jstack生成的Thread Dump日志.docx

    当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行的条件没有满足,它则调用对象(通常是被synchronized的对象)的wait()方法,放弃Monitor,进入 "Wait Set"队列。只有当别的线程在该对象上调用了 ...

    死锁的实现

    此类实现了死锁.主要是运用synchronized和sleep()方法实现

    .net C#线程超时

    Thread.Sleep(10 * 1000); } } private static void ExitInvalidThread() { #region 移除不存在的线程(比如线程运行完正常退出终了) Hashtable AllCurrentThreadIDs = new Hashtable(); ...

    .net c#线程超时解决方案

    Thread.Sleep(10 * 1000); } } private static void ExitInvalidThread() { #region 移除不存在的线程(比如线程运行完正常退出终了) Hashtable AllCurrentThreadIDs = new Hashtable(); ...

    j2me手机蓝牙OBEX传文件代码

    Thread.sleep(5000); t.setString(rd.getFriendlyName(true)); Thread.sleep(5000); disc_agent.searchServices(null, u,rd, serv_listener); serv_listener.wait(); } 4.从搜索到的ServiceRecord 中取出连接...

    Java测试题2答案

    DEF A notify() B wait() C notifyAll() D sleep() E.yield() F.synchronized(this) 7.构造BufferedInputStream的合适参数是哪个? AC A BufferedInputStream B BufferedOutputStream ...

    JAVA多线程技术分享-39页PPT(winding)

    1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3,线程停止打断 4,守护线程 二 锁: 1,乐观锁 悲观锁 2,自旋锁 适应性自旋锁 3,synchronized 锁升级 4,公平锁 非公平锁 5,可重入锁 非可重入锁 三: ...

    ym_java-YOYOPlayer-src

    private long threadSleep = -1; private static Logger log = Logger.getLogger(BasicPlayer.class.getName()); /** * These variables are used to distinguish stopped, paused, playing states. * We need ...

    生产者消费者JAVA课程设计

    Thread.sleep//线程休眠 ((int)(Math.random() * 200));//以0~200ms的速度随机 } catch (InterruptedException e) //当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常 { e...

    java火车收票多线程

    public class ThreadTest implements Runnable { private int tickets = 1000; public void run() { while(tickets >= 1) ... Thread.sleep(10); }catch(Exception e) { e.printStackTrace();

    java笔试题大集合及答案(另附各大公司笔试题)

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...

    千方百计笔试题大全

    189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is HTTP Session tracking and why is it important? 45 191、What is session management, and how is ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    如果让你设计一个动态大小的线程池,如何设计,应该有哪些方法? 87 【多线程】CyclicBarrier 和 CountDownLatch的不同 88 CountDownLatch 88 CyclicBarrier 89 区别: 89 【多线程】简述synchronized 和java.util....

Global site tag (gtag.js) - Google Analytics