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函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下
delphi vcl线程同步synchronize
Synchronize的几种实现 Synchronize有三种实现。 同步方法,修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代码块...
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
CALL RFC synchronize and asychronize Examples
Synchronize It!还有其他特点如下: 1.可以自订许多的项目,包括过滤器、专案、颜色等等。 2.可以进行多种同步任务独立保存和点用,也可组合多个任务一次同步搞定。 3.支持压缩文件的同步。 4.内建二进位文件的比较...
Java对象锁和类锁全面解析(多线程synchronized关键字)编程开发技术共14页.pdf.zip
synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下: 1. 先写好一个SynchronizedTest.java文件(下面贴出) 2. 在java文件的目录下,使用命令 javac ...
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 ...
NotePad++的ftp插件,注意是32位的,涵盖FTP_synchronize.dll、FTP_synchronizeA.dll
关于线程同步 synchronize,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。
synchronize详解
一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...
synchronize.zip
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...
simple configure file to synchronize the connection between two computers (using vnc)
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...