`
wen742538485
  • 浏览: 239705 次
  • 性别: 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线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统线程之间的关系。在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是...

    3-Threads-Runnable-Sleep-Sync:并行编程示例:3使用Thread.sleep()的可运行实现的线程同步

    本示例“3-Threads-Runnable-Sleep-Sync”着重探讨了如何使用`Thread.sleep()`方法来控制线程的执行顺序和同步,从而避免资源竞争问题,确保程序的正确性。 首先,我们要理解`Thread.sleep()`方法的作用。它是一个...

    java sleep和wait的解惑.docx

    - **线程状态变化**:当调用 `Thread.sleep()` 时,当前线程会从运行状态 (`RUNNABLE`) 转变为阻塞状态 (`BLOCKED`)。在此期间,线程不会消耗CPU资源,也不会占用任何锁。 - **不会释放锁**:如果当前线程持有某个...

    java里面synchronized用法.doc

    Thread.sleep(10); } catch (Exception e) { e.getMessage(); } System.out.println(Thread.currentThread().getName() + " this is " + num--); } } } } } ``` 在上面的例子中,synchronized 关键字被用于...

    java_synchronized详解

    当一个线程进入某个对象的一个`synchronized`代码块时,它会自动获得该对象的锁;离开该代码块时,则自动释放锁。如果其他线程尝试访问同一对象的其他`synchronized`代码块,它们将被阻塞,直到第一个线程释放锁为止...

    JAVA synchronized详解

    1. **互斥性**:如果一个线程获得了对象的锁,那么其他试图获取该锁的线程将会被阻塞,直到第一个线程释放锁。 2. **可见性**:当一个线程修改了共享变量,并释放锁后,另一个线程可以获得这个锁并能立即看到这个...

    Java 同步锁(synchronized)详解及实例

    Java中的同步锁,即`synchronized`关键字,是Java多线程编程中用于解决并发问题的重要机制。它确保了对共享资源的互斥访问,防止数据的不一致性。当我们有多线程环境并涉及到共享数据时,可能会出现竞态条件,就像...

    JavaThread.pdf

    - Thread.sleep()使当前线程休眠指定的毫秒数,Thread.yield()则是让当前线程让步,给其他线程运行的机会。 - Thread.dumpStack()打印当前线程的堆栈跟踪,join()方法等待线程终止。 9. **监控和调试** - Thread...

    java synchronized关键字原理、自定义一把锁来实现同步等

    ### Java synchronized 关键字原理与自定义锁实现详解 #### 一、Java synchronized 关键字原理 `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种...

    synchronized详解

    即使有多个线程尝试同时执行这段代码,也只有第一个获得锁的线程能够进入,其他线程必须等待锁被释放。 ```java public class Thread1 implements Runnable { public void run() { synchronized (this) { for ...

    Java使用synchronized实现互斥锁功能示例

    Java使用synchronized实现互斥锁功能示例 在Java编程语言中,synchronized关键字是实现互斥锁功能的主要手段。互斥锁是一种机制,用于控制多个线程访问共享资源的顺序,从而避免因为资源竞争而导致的程序错误。在...

    C#中sleep和wait的区别分析

    值得注意的是,`Sleep` 不会释放任何锁,这意味着如果在一个同步上下文中(如 synchronized 或 Monitor 代码块)调用 `Sleep`,其他等待同一锁的线程仍然会被阻塞,无法获取锁并继续执行。此外,`Sleep` 时间结束后...

    synchronized.pdf

    Java的`synchronized`锁是可重入的,意味着一个线程如果已经获得了某个对象的锁,它还可以再次请求这个锁,不会被自己阻塞。这对于递归方法或嵌套同步块是必要的。 7. **wait(), notify()与notifyAll()**: `...

    java的Lock锁原理详解.docx

    一旦线程获得了锁,开发者无法得知锁的状态,也无法控制何时释放锁,这可能导致死锁或资源浪费。 相反,Lock是Java并发包java.util.concurrent.locks中的接口,它提供了更细粒度的锁控制。Lock接口提供了比...

    java核心知识点整理.pdf

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

    java_经典Sleep与异步同步并发编程

    在Java中,`Thread.sleep(long millis)` 方法可以使当前正在执行的线程暂停执行指定的时间(以毫秒为单位),从而让出CPU给其他线程使用。在此期间,线程处于阻塞状态。通过调用线程的 `interrupt()` 方法可以提前...

    sleep() 方法和wait()方法的区别.docx

    sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞状态(阻塞当前线程),让出 CPU 的使用,目的是不让当前线程独自霸占该进程所获的 CPU 资源,以留一定时间给其他线程执行的机会。...

    Java Synchronized锁失败案例及解决方案

    Java Synchronized锁失败案例及解决方案 Java Synchronized锁是一种同步机制,用于解决多线程并发访问共享资源的问题。它通过锁机制来实现线程之间的同步,防止多个线程同时访问同一个资源,从而避免了线程安全问题...

    Java课件\thread.rar

    - **Lock接口**:提供比`synchronized`更细粒度的控制,如`ReentrantLock`可实现公平锁和非公平锁。 4. **线程通信** - **wait(), notify(), notifyAll()**:这些方法用于线程间通信,必须在同步环境中使用,用于...

Global site tag (gtag.js) - Google Analytics