synchronized 静态 非静态 方法 使用不同锁对象
2012-10-17 19:49
316 查看
http://developer.51cto.com/art/200906/132360.htm看此文章锁的一些实验验证
用synchronized分别修饰静态方法和非静态方法,使用的锁分别为
静态:class对象的锁
非静态:本对象的锁
实验1:对静态方法和非静态方法用synchronized进行修饰
结论:出现错乱的输出,说明静态方法和非静态方法用不同的锁
实验2:对静态方法用synchronized,非静态方法用synchronized块对 class对象加
结论:正确输出,确认静态方法确实使用class对象的锁,而非静态方法使用synchronized默认使用this锁(自己试试吧)
实验代码如下:
以上存自我学习,有什么错误请大家指教,大榭啊
用synchronized分别修饰静态方法和非静态方法,使用的锁分别为
静态:class对象的锁
非静态:本对象的锁
实验1:对静态方法和非静态方法用synchronized进行修饰
结论:出现错乱的输出,说明静态方法和非静态方法用不同的锁
实验2:对静态方法用synchronized,非静态方法用synchronized块对 class对象加
结论:正确输出,确认静态方法确实使用class对象的锁,而非静态方法使用synchronized默认使用this锁(自己试试吧)
实验代码如下:
import java.io.*; public class TestClassInstance{ public static void main(String[] args)throws IOException{ MyThread t1 = new MyThread(); YourThread t2 = new YourThread(t1); t1.start(); t2.start(); } } class MyThread extends Thread { private static FileOutputStream out; static{ try{ out = new FileOutputStream("1.txt"); }catch(IOException e){ } } public void run(){ try{ printlog(); }catch(IOException e){ } } public synchronized static void printlog()throws IOException{ OutputStreamWriter ou = new OutputStreamWriter(out); //synchronized(MyThread.class){ for (int i = 0 ; i < 100000 ; i++ ) { ou.write("*"); } ou.flush(); //} } public synchronized void printmsg()throws IOException{ OutputStreamWriter ou = new OutputStreamWriter(out); //synchronized(YourThread.class){ for (int i = 0 ; i < 100000; i++ ) { ou.write("@"); //synchronized(YourThread.class){ //} } ou.flush(); //} } } class YourThread extends Thread { private MyThread myThread; public YourThread(MyThread m){ this.myThread = m; } public void run(){ try{ myThread.printmsg(); }catch(IOException e){ } } }
以上存自我学习,有什么错误请大家指教,大榭啊
相关文章推荐
- java同步静态方法与非静态方法(使用synchronized关键字)
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- 线程安全,可以使用synchronized在对象及方法上加锁。
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
- 怎样在静态方法中使用 synchronized
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- Android开发笔记之工具类使用静态方法与单例对象方法的优劣
- jq对象 dom对象的转换 为啥转换?因为jq和dom对象具有不同的方法可以使用
- jq对象 dom对象的转换 为啥转换?因为jq和dom对象具有不同的方法可以使用
- java中synchronized的普通方法与静态方法获取的锁对象是什么
- 2.2.5一个对象不同的方法synchronized (this)是同一个对象锁
- 使用.net-Synchronized属性进行静态方法的同步
- 使用扩展方法和静态门面类实现伪领域对象
- 【慕课笔记】U1 类和对象 第7节 JAVA中的static使用之静态方法
- Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题
- 怎样在静态方法中使用 synchronized
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- JAVA中两个不同对象的equals方法使用注意点
- 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字