`
落花残月
  • 浏览: 5397 次
  • 性别: Icon_minigender_1
  • 来自: 舟山
社区版块
存档分类
最新评论

深入探析Java线程锁机制

阅读更多

     今天在iteye上提了一个关于++操作和线程安全的问题,一位朋友的回答一言点醒梦中人,至此我对Java线程锁有了更加深刻的认识。在这里也做个总结供大家参考。

        先看几段代码吧!

     

   代码一:

     

public class TestMultiThread2 implements Runnable{

	private static Object o = new Object();
	
	private static Integer si = 0;
	
	private static AtomicInteger flag = new AtomicInteger();
	
	@Override
	public void run() {
		for(int k=0;k<2000000;k++){
			synchronized(si){
				si++;
			}
		}
		flag.incrementAndGet();
	}
	public static void main(String[] args) throws InterruptedException{
		TestMultiThread2 t1 = new TestMultiThread2();
		TestMultiThread2 t2 = new TestMultiThread2();
		ExecutorService exec1 = Executors.newCachedThreadPool();
		ExecutorService exec2 = Executors.newCachedThreadPool();
		exec1.execute(t1);
		exec2.execute(t2);
		while(true){
			if(flag.intValue()==2){
				System.out.println("si>>>>>"+si);	
				break;
			}
			Thread.sleep(50);
		}

		
	}	
	
}

 

 

   为了方便看,重复的就不插入了,从代码二到代码四只插入run()方法中的代码,其他地方都一样

 

  代码二:

 

	public void run() {
		for(int k=0;k<2000000;k++){
			synchronized(o){
				si++;
			}
		}
		flag.incrementAndGet();
	}

  

 

  代码三:

 

 

 

	public void run() {
		for(int k=0;k<2000000;k++){
			synchronized(o){
				si++;
				o = new Object();
			}
		}
		flag.incrementAndGet();
	}

 

 

    代码四: 

   

	public void run() {
		for(int k=0;k<2000000;k++){
			synchronized(o){
				si++;
				Object temp = o;
				o = new Object();
				o = temp;
			}
		}
		flag.incrementAndGet();
	}

 

 

  有了这四段代码我想问题大概可以说明白了,这里说一下输出吧。

 

  代码一:<4000000

  代码二:=4000000

  代码三:<4000000

  代码四:<4000000(PS:这个结果非常接近4000000)

 

  这里说明一下我测试中碰到的问题,代码四一直没有跑出我想要的结果,主要是开始我设的循环次数太少,其实这里如果要这个现象更加明显一些可以在中间多new 几个Object 如下面的代码五,这样现象就比较明显了。

 

  代码五:

 

	public void run() {
		for(int k=0;k<2000000;k++){
			synchronized(o){
				si++;
				Object temp = o;
				for(int m=0;m<10;m++){
					o = new Object();
				}
				o = temp;
			}
		}
		flag.incrementAndGet();
	}

  

 为什么会出现上面的现象:

 代码一:当si做++操作后(可以直接看字节码,这里不贴了)在putstatic之前有几步操作,就是我们常说的非原子操作,而这时候si已经不是原来的对象了,这样锁对另外一个线程来说就失效了,我想代码三和代码四就是最好的佐证,代码四更有说服力。当时因为没有出现预想的情况困惑了挺久。

 

其实这里用字节码来解释还不是很严谨,最好的当然直接是汇编代码

 

   如有什么问题还希望各位读者指正。

 

分享到:
评论

相关推荐

    基于Java多线程机制的探析

    ### 基于Java多线程机制的探析 #### 摘要 本文深入探讨了Java多线程机制的基本原理及其应用场景。首先简要分析了Java多线程的概念及其实现方法,随后详细介绍了多线程在多用户远程协同工作系统中的应用,特别是...

    Java线程同步原理探析.pdf

    Java线程同步原理探析

    编程机制探析初稿

    资源名称:编程机制探析 初稿 编程机制探析 目 录 1. 编程机制探析(Insight into Programming Mechanism) 1.1 《编程机制探析》初稿目录(已提供PDF下载) 4 1.2 《编程机制探析》第一章 写作初衷——若是当年早...

    探析JAVA编程语言在计算机软件开发中的应用.pdf

    4. 稳定性和安全性:Java语言的内存管理机制(如自动垃圾回收)和安全模型(例如类加载器和字节码校验器)可以降低许多常见的编程错误和安全漏洞。 5. 强大的社区和生态系统:Java有着庞大的开发者社区,以及广泛...

    Java语言反射机制原理探析.pdf

    本文将深入探讨Java反射机制的原理及其在Java中的实现方式。 首先,反射的重要性体现在几个方面。它提高了程序的灵活性和扩展性,允许在不修改现有代码的情况下,根据需求动态地创建对象和调用方法。通过反射,可以...

    Java语言反射机制原理探析.zip

    Java语言的反射机制是其强大的特性之一,它允许在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这一机制对于理解和利用Java的灵活性至关重要,尤其在元编程、框架设计、插件系统以及...

    设计模式视角探析Java课程教学改革.pdf

    设计模式视角探析Java课程教学改革.pdf

    探析JAVA编程语言在计算机软件开发中的应用.zip

    另外,Java还有垃圾回收机制,自动管理内存,避免了内存泄露问题。 2. **Java在软件开发中的应用** - **企业级应用**:Java是开发企业级应用的首选语言,如ERP、CRM系统等。Spring框架和Hibernate ORM工具为开发...

    基于Java语言中异常的深入探析.pdf

    java语言是一种易学易用的网络设计语言,它有简单易学、面向对象、动态性、解释执行性、多线程性、安全性和健壮性等特点。在众多的特点中,笔者重点研究java的健壮性。如何增强程序的健壮性?相当其它语言来说,java语言...

    计算机软件Java编程特点及技术的探析.pdf

    3. 自动化内存管理:Java提供了自动的垃圾回收机制,这意味着程序员不需要像在C或C++中那样手动管理内存。这减少了内存泄漏和其他与内存管理相关的错误,同时简化了开发过程。 4. 强大的标准库和第三方库支持:Java...

    探析中日农村教育机制的差异.pdf

    探析中日农村教育机制的差异.pdf

    探析Java数据库连接池运行原理.pdf

    "探析Java数据库连接池运行原理.pdf" 本文探讨了Java数据库连接池的运行原理,探究了连接池的工作原理、程序实现和优点。连接池是一种技术,用于解决数据库连接的频繁分配和释放问题,提高系统性能。 数据库连接池...

    深入探析C语言中多分支结构的性能.pdf

    深入探析C语言中多分支结构的性能

    基于多线程Java程序安全行为模型的静态检查对策探析.pdf

    基于多线程Java程序安全行为模型的静态检查对策探析 本文主要讨论基于多线程Java程序安全行为模型的静态检查对策探析,通过参数化扩展上下文无关文法作为安全相关行为模型的抽象表示,总结出了从多线程Java程序自动...

    探析计算机软件Java编程特点及技术 (1).pdf

    Java的安全性得益于其强大的类型检查机制和沙箱执行环境,使得程序的执行更加安全可靠。此外,Java的平台独立性允许开发人员编写一次代码,然后在任何支持Java虚拟机的平台上运行,实现了“一次编写,到处运行”的...

    java教学方法探析

    Java 语言是如今社会上众多开发语言的支柱之一,越来越多的企 业使用J ava 语言进行开发的工作。对于各高校的计算机相关专业,也把 Java 语言作为重要的必修课予以设置。其后续课也是以Java 语言为基础的 课程。可谓...

    Java程序设计语言在软件开发中的应用探析.pdf

    Java语言具有可移植性强、多线程、面向对象等特点,使其成为软件开发中不可或缺的工具。Java语言的设计初衷是“一次编写,到处运行”,即能够使同一段代码在不同的操作系统上运行而无需修改。同时,Java语言提供的多...

    Java的I_O处理技术探析.pdf

    本文探析了Java的I/O处理技术,旨在提供一个深入理解Java I/O处理技术的基础,帮助开发者更好地理解和使用Java的I/O处理技术。 Java的I/O处理技术的分类: 1. 文件输入输出:Java中通过File类、FileInputStream类...

    探析计算机软件Java编程特点及技术.zip

    本文将深入探讨Java编程的特点和技术,帮助读者理解其核心优势和应用。 一、Java的跨平台特性 Java的“一次编写,到处运行”(Write Once, Run Anywhere,简称WORA)理念是其最显著的特点之一。这得益于Java虚拟机...

Global site tag (gtag.js) - Google Analytics