`
Xcupidtx
  • 浏览: 14621 次
社区版块
存档分类
最新评论

java synchronize初探

    博客分类:
  • JAVA
 
阅读更多

java锁机制初探,实例学习

 

 

package com.yjf.image;

public class TT implements Runnable {
	
	int a = 0;
	
	@Override
	public void run() {
		try {
			m1();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void m1() throws InterruptedException {
		a = 1000;
		Thread.sleep(5000);
		System.out.println("m1:" + a);
	}
	
	public synchronized void m2() throws InterruptedException {
		Thread.sleep(1000);
		a = 2000;
		System.out.println("m2:" + a);
	}		

	public static void main(String[] args) throws InterruptedException {
		TT tt = new TT();
		Thread t = new Thread(tt);
		t.start();
		Thread.sleep(20);
		tt.m2();
		Thread.sleep(6000);
		System.out.println("main:" + tt.a);
	}
}

 

 

定义了一个线程类TT,实现Runnable接口,两个方法m1和m2都加了锁,main方法有两个线程:线程main和线程t。运行结果为:

m1:1000

m2:2000

main:2000

 

因为m1和m2都加了锁,代码先执行了t.start,即执行到了m1代码块,此时线程睡了5秒,但它睡着的时候还抱着当前对象的锁。在它睡着的过程中,代码执行到tt.m2();,但由于m2是个synchronised的方法,它要执行的话,必须要先获得一把锁,但这把锁被m1抱着,所以必须等到m1执行完成后,m2才能执行。

 

如果把m2的synchronized修饰符去掉,那么运行结果为:

m2:2000

m1:2000

main:2000

因为m1睡着了,抱着当前对象的锁,但m2不是一个synchronized方法,它执行前不用获得锁,所以在m1睡着的过程中,m2先执行完了。

 

如果把m1声明为public static synchronized void m1(),把m2声明为synchronized,把成员变量a变成static,运行结果为:

m2:2000

m1:2000

main:2000

分析:因为m1是static方法,它睡着的时候抱着一把锁,但这把锁不是当前对象的锁,而是当前类的锁。m2执行时,需要获得一把当前对象的锁,它当然可以获得。所以m2比m1先执行完。

 

如果把m2声明为public static synchronized void m2(),把m1声明为public static synchronized void m1(),把tt.m2()改为TT.m2(),执行结果为:

m1:1000

m2:2000

 

main:2000

 

分析:m1睡着的时候锁住了当前类,而m2执行的时候需要获得当前类的锁,所以必须等m1执行完把锁释放后,m2才能执行。

 

最后提一点,main方法中有这几句话:

                 t.start();

Thread.sleep(20);

 

TT.m2();

如果去掉中间这句:Thread.sleep(20);,会出现不一样的结果。因为主线程的优先级大于分支线程,CPU会这样分配时间。t.start(),启动一个线程,实际上不是启动,而是初始化了一个线程t,CPU会先分配时间片给TT.m2(),所以我加个Thread.sleep(20),让主线程睡一会,排除干扰。

 

分享到:
评论

相关推荐

    java synchronize 线程同步

    当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。

    Java synchronize线程安全测试

    主要介绍了Java synchronize线程安全测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java synchronize底层实现原理及优化

    主要介绍了Java synchronize底层实现原理及优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 中synchronize函数的实例详解

    主要介绍了Java 中synchronize函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下

    delphi vcl线程同步synchronize

    delphi vcl线程同步synchronize

    Java之Synchronize学习

    Synchronize的几种实现 Synchronize有三种实现。 同步方法,修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代码块...

    synchronized关键字的用法详解

    synchronized关键字在java中的重要性 以及常用的方法 还有它的详解

    CALL RFC synchronize and asychronize Examples

    CALL RFC synchronize and asychronize Examples

    Synchronize It 3.5文件夹同步器 简体中文界面

    Synchronize It!还有其他特点如下: 1.可以自订许多的项目,包括过滤器、专案、颜色等等。 2.可以进行多种同步任务独立保存和点用,也可组合多个任务一次同步搞定。 3.支持压缩文件的同步。 4.内建二进位文件的比较...

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

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

    synchronize底层实现原理

    synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下: 1. 先写好一个SynchronizedTest.java文件(下面贴出) 2. 在java文件的目录下,使用命令 javac ...

    Java 7 Concurrency Cookbook

    of how to use the new Java 7 Phaser class to synchronize tasks divided into phases. Chapter 4, Thread Executors will teach the readers to delegate the thread management to executors. They allow ...

    FTP_synchronize_0_9_6_1_dll

    NotePad++的ftp插件,注意是32位的,涵盖FTP_synchronize.dll、FTP_synchronizeA.dll

    java 线程同步 信号量控制同步

    关于线程同步 synchronize,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。

    synchronize.pdf

    synchronize详解

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    synchronize.zip

    synchronize.zip

    java程序员面试题

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    vnc.rar_Computers_file synchronize

    simple configure file to synchronize the connection between two computers (using vnc)

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

Global site tag (gtag.js) - Google Analytics