`
wang吖
  • 浏览: 234787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java多线程-对象锁Synchronized之我见

阅读更多

正确理解Java中的多线程多Synchronized对我们学习多线程编程非常重要,下面的测试程序阐述了Java对象锁的特性,例子如下

Coding:

 

/**
 * 该例子程序是为了理解Java线程里面提供的同步关键字 synchronized 对象锁 synchronized
 * 获取的是对象锁,我们可以理解为对象的锁就一把,一旦一根线程获取之后另外一根线程就只能等待 以下的模拟是:
 * 
 * 当一根线程进入一个对象的synchrozied方法之后,另外的线程将无法同时在进入该
 * 对象其它的synchronized方法,但是可以进入该对象的其它非synchronized
 * 
 * 测试注意事项:
 * <li>1、由于线程执行的随机性,只要获取到锁的线程进入睡眠状态则其它线程就不能在其释放锁之前进入其它的同步方法</li>
 * <li>2、当狗开始叫先执行,那么吃的执行就会一直要等到叫执行完之后才能执行,而摇尾巴的方法不会受到锁的限制</li>
 * <li>3、调试可以自己修改随意选择一个休眠的线程,然后分析打印结果</li>
 * 
 * @author 吖大哥
 * @date Jun 1, 2014 4:43:17 PM
 */
public class ThreadTester {

	public static void main(String[] args) {

		// 前提同一只狗在同一时刻他的嘴巴只能干一件事,当然你一定要认为它边吃还能边叫,那我也没办法
		final DogAction dog = new DogAction("哈士奇0001");

		// 狂叫线程
		new Thread(new Runnable() {
			public void run() {
				dog.barking();
			}
		}).start();

		// 狂吃线程
		new Thread(new Runnable() {
			public void run() {
				dog.eating();
			}
		}).start();

		// 狂摇尾巴
		new Thread(new Runnable() {
			public void run() {
				dog.tailing();
			}
		}).start();
	}
}

// 狗的行为类
class DogAction {

	private String name;

	public DogAction(String name) {
		this.name = name;
	}

	public synchronized void barking() {
		try {
			System.out.println("----------------已获得锁啦----------------");
			Thread.currentThread().sleep(6000);
			System.out.println(name + "正在狂叫**************");
			System.out.println("----------------已释放锁啦----------------");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public synchronized void eating() {
		try {
			// Thread.currentThread().sleep(6000);
			System.out.println(name + "正在狂吃**************");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void tailing() {
		try {
			Thread.currentThread().sleep(200);
			System.out.println(name + "正在狂摇尾巴**************");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 执行结果:

----------------已获得锁啦----------------
哈士奇0001正在狂摇尾巴**************
哈士奇0001正在狂叫**************
----------------已释放锁啦----------------
哈士奇0001正在狂吃**************

 

执行中截图:



 

 

  • 大小: 129.1 KB
分享到:
评论

相关推荐

    16.线程的同步机制-synchronized同步方法-多个对象使用多个对象锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java对象锁和类锁全面解析(多线程synchronize

    Java对象锁和类锁全面解析(多线程synchronized关键字)编程开发技术共14页.pdf.zip

    java多线程设计模式详解(PDF及源码)

    去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...

    Java多线程编程

    包括java的Thread类,同步块(synchronized),可重入锁,Object方法以及对象监视器等内容。

    java多线程编程_java多线程_

    1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...

    synchronized用法大全实例

    java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来

    28.线程的同步机制-synchronized同步语句-synchronized(this)代码块是锁定当前对象.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java多线程 之 临界区、ThreadLocal.docx

    synchronized关键字不属于方法特征签名的一...注意:使用synchronized是对哪个对象加的锁。 如果在一个类内部都是使用synchronized关键字定义了方法f(),g()。那么当使用这个类的实例调用f()时,就不能再调用g()方法。

    34.线程的同步机制-synchronized同步语句-锁对象的内容改变.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java关键字Synchronized详解

    这种机制可以有效地避免多线程环境下的数据竞争和不一致问题。 在Java中,锁膨胀(Lock Inversion)是一个重要的概念。当一个对象被多个线程同时持有锁时,可能会导致锁膨胀现象。锁膨胀是指原本互斥的两个锁,由于...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    29.线程的同步机制-synchronized同步语句-使用任意对象作为对象锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java synchronized详细解读.docx

    Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 需要明确的几个问题: synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句...

    图解java多线程设计模式

    java.util.concurrent包、synchronized关键字、Swing框架、Java内存模型等内容也均有涉及,不仅能够了解Java多线程的相关知识,还可加深对Java语言的理解。 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java...

    Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用,分享给大家,具体如下: 一、同步机制关键字synchronized 对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数...

    java 多线程 同步详解

    java 多线程同步详解 synchronized 的使用,锁定对象 ,锁定类 区别

    Java多线程同步Synchronized深入解析

     1、在系统中对访类要使用多线程进行访问;  2、在该类中有 类变量,或者是 在类的方法中有访问公共资源(如一个外部文件的读写)。  同步锁锁定的内容是什么?  无论你将Synchronized加在方法前还是加在...

    深入讲解java线程与synchronized关键字

    Java 中多线程的同步依靠的是对象锁机制,synchronized关键字就是利用了封装对象锁来实现对共享资源的互斥访问。下面这篇文章主要介绍了java线程与synchronized关键字的相关资料,需要的朋友可以参考下。

    java模拟多线程买票问题.docx

    多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

Global site tag (gtag.js) - Google Analytics