java线程的一点感悟(sleep,wait,synchronized,时间片等)

原创 2018年04月15日 23:59:14

志在以实例的方式描述线程中使用的一些容易混淆概念的方法。

1、sleep()方法不释放锁

public class SleepFunction {
	static final Object obj = new Object();
public static void main(String[] args) {
	
	new Thread(new Runnable() {
		public void run() {
			
	        synchronized (obj) {
				System.out.println("new thread join");
				obj.notify();
				System.out.println("new thread end");
			}
		}
	}).start();
	while (true) {
		synchronized (obj) {
		System.out.println("begin");
		
		
			try {
				Thread.sleep(3000);  //sleep 不释放锁
				//obj.wait();      //释放锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("one loop end");
		}
	}
}
}

输出结果:

begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
begin
one loop end
.....

主线程将一直打印下去,永远结束不了,而子线程没有机会执行

2、wait()方法释放锁

public class SleepFunction {
	static final Object obj = new Object();
public static void main(String[] args) {
	
	new Thread(new Runnable() {
		public void run() {
			
	        synchronized (obj) {
				System.out.println("new thread join");
				obj.notify();
				System.out.println("new thread end");
			}
		}
	}).start();
	while (true) {
		synchronized (obj) {
		System.out.println("begin");
		
		
			try {
				//Thread.sleep(3000);  //sleep 不释放锁
				obj.wait();      //释放锁
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("one loop end");
		}
	}
}
}

输出结果:

begin
new thread join
new thread end
one loop end
begin

主线程释放锁,子线程执行结束以后,主线程永远阻塞

3、不知道大家有没有一个混淆的地方,就是调用锁obj.wait()阻塞当前线程,被notify()函数唤醒以后,是从obj.wait()函数继续往下执行呢还是从while()循环继续判断开始呢

上面2例也验证了这个结果,是从obj.wait()接着往下执行,而不需要再一次从循环开始

4、

Java中synchronized,sleep()和wait()的初略认知

最近学习刚Java中锁的概念(是看着传智的视频看的) 先来说说synchronized吧,一开始没有认真思考,一直以为synchronized是把整个区域锁了起来,后来才知道原来它的作用是把一个对象...
  • kunfd
  • kunfd
  • 2016年08月14日 11:55
  • 689

线程-synchronized(this)的含义和wait和sleep的区别

1、synchronized(this)的含义,是锁定当前对象,还是锁定一段代码,举个例子看看能另外一个线程能否访问这个类对private属性。 事实证明,synchronized修饰的method1...
  • magicxin031
  • magicxin031
  • 2016年04月28日 11:21
  • 1058

JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll

java线程存在以下几种状态: 1: 创建tai
  • xianymo
  • xianymo
  • 2014年08月15日 17:42
  • 562

synchronized , sleep ,wait ,notify,等的理解

1.  sleep是Thread类的静态方法,谁调用谁去睡觉。sleep是占用cpu去睡觉,而wait是放弃cpu去睡觉, sleep没有释放锁,而wait释放了锁,sleep不会让出cpu资源,wa...
  • tianyeming
  • tianyeming
  • 2015年01月26日 11:34
  • 3283

深入理解Java多线程中的wait(),notify()和sleep()

大家在学习Java的过程中,势必要进行多线程的系统学习,这部分内容知识对于你在工作中的影响是极大的,并且在面试的过程中,这部分知识也是必然会被问到的。既然多线程的知识如此重要,那么我们就不能浅尝辄止。...
  • Kaka534
  • Kaka534
  • 2016年07月07日 10:41
  • 15939

多线程中sleep()、wait()方法等得区别?

本文转载:http://blog.csdn.net/u0fly/article/details/6386591 1、这两个方法来自不同的类分别是Thread和Object   2、最主要是slee...
  • love_Sophie
  • love_Sophie
  • 2011年09月23日 00:52
  • 36009

Synchronized不一定是线程安全的吧?_wait释放同步锁

在做并发开发的时候,为了保证某对象的线程安全,一般都会对其用Synchronized进行保护,比如: synchronized(obj) { // Do something with obj...
  • sRhee
  • sRhee
  • 2017年10月18日 10:18
  • 201

Java wait、notify与synchronized的奇妙之处

synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。synchronized就是针对内存区块申请内存锁。(1)JA...
  • chy555chy
  • chy555chy
  • 2016年08月22日 19:26
  • 2633

java多线程中的synchronized和wait/notify用法总结

自学java也有一段时间了,自我感觉java中的多线程还是比较重要的。至于线程的概念,也没有必要说的那么玄乎,引用马士兵老师的话就很好理解:线程就是程序执行的路径。多线程,也就不难理解了,程序执行的多...
  • gtkknd
  • gtkknd
  • 2016年01月21日 15:42
  • 634

java---synchronized和sleep

  被synchronized作用的对象线程,该线程sleep后,马上别的线程会接着执行。看下面程序的执行结果:t1:0t2:0t2:1t1:1t1:2t2:2t2:3t1:3如果将   Thread...
  • lijinghqf
  • lijinghqf
  • 2008年03月05日 18:09
  • 1395
收藏助手
不良信息举报
您举报文章:java线程的一点感悟(sleep,wait,synchronized,时间片等)
举报原因:
原因补充:

(最多只允许输入30个字)