2.3静态synchronized同步方法和synchronized(class)代码块
来源:互联网 发布:arrayremove php 编辑:程序博客网 时间:2024/05/19 00:47
静态synchronized同步方法和synchronized(class)代码块
synchronized关键字加到static静态方法就是给Class类上锁,而synchronized(class)同步代码块的作用也是一样的。
package com.myObject;public class Object1 { synchronized public void print() { try { System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin"); Thread.sleep(3000); System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end"); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized static public void print2() { try { System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin"); Thread.sleep(3000); System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end"); } catch (InterruptedException e) { e.printStackTrace(); } } public void print3() { try { synchronized(Object1.class){ System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin"); Thread.sleep(3000); System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end"); } } catch (InterruptedException e) { e.printStackTrace(); } }}
package com.myThread;import com.myObject.Object1;public class Thread1a extends Thread { Object1 object1; public Thread1a(Object1 object1) { this.object1 = object1; } @Override public void run() { super.run(); object1.print(); }}
package com.myThread;import com.myObject.Object1;public class Thread1b extends Thread { Object1 object1; public Thread1b(Object1 object1) { this.object1 = object1; } @Override public void run() { super.run(); object1.print2(); }}
package com.myThread;import com.myObject.Object1;public class Thread1c extends Thread { Object1 object1; public Thread1c(Object1 object1) { this.object1 = object1; } @Override public void run() { super.run(); object1.print3(); }}
package com.test;import com.myObject.Object1;import com.myThread.Thread1a;import com.myThread.Thread1b;import com.myThread.Thread1c;public class Test1 { public static void main(String[] args) throws InterruptedException { Object1 object1 = new Object1(); Thread1a thread1a = new Thread1a(object1); thread1a.setName("a"); thread1a.start(); Thread1b thread1b = new Thread1b(object1); thread1b.setName("b"); thread1b.start(); Thread1c thread1c = new Thread1c(object1); thread1c.setName("c"); thread1c.start(); }}
打印结果
1452755386081 c:begin
1452755386081 a:begin
1452755389082 a:end
1452755389082 c:end
1452755389082 b:begin
1452755392082 b:end
分析:
1)a和b(或者c)对比是异步的,说明this锁和Class锁是不同的锁
2)b和c对比是同步的,说明静态synchronized同步方法和synchronized(class)代码块都是Class锁
this锁和Class锁的作用范围
this锁:同一对象同一实例
Class锁:同一对象的所有实例
将上面例子的测试方法改为
package com.test;import com.myObject.Object1;import com.myThread.Thread1a;import com.myThread.Thread1b;import com.myThread.Thread1c;public class Test1 { public static void main(String[] args) throws InterruptedException { Object1 object1 = new Object1(); Object1 object2 = new Object1();// Thread1a thread1a = new Thread1a(object1);// thread1a.setName("a");// thread1a.start(); Thread1b thread1b = new Thread1b(object1); thread1b.setName("b"); thread1b.start(); Thread1c thread1c = new Thread1c(object2); thread1c.setName("c"); thread1c.start(); }}
打印结果
1452756237100 b:begin
1452756240100 b:end
1452756240100 c:begin
1452756243100 c:end
0 0
- 2.3静态synchronized同步方法和synchronized(class)代码块
- java多线程之-----静态同步synchronized方法与synchronized(class) 代码块
- 《多线程编程》学习之五:synchronized同步语句块,静态同步synchronized方法与synchronized(类名.class)代码块
- Synchronized 同步方法和同步代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- 同步synchronized方法和代码块
- [转]同步synchronized方法和代码块
- 线程同步总结--synchronized方法和synchronized代码块
- 同步synchronized方法和代码块(强文)
- 同步代码块。同步方法 synchronized
- 2.2.9同步静态方法和synchronized(class)效果一样
- latex对齐问题
- Linux socket 获得本地IP和广播地址
- sql cast
- android实现多界面左右滑动切换
- Backbone.js 的最佳应用场景有哪些?
- 2.3静态synchronized同步方法和synchronized(class)代码块
- 【总结】Scrum敏捷开发
- 学习web测试之二
- 用lua写Android界面学习笔记
- dns 源码安装
- 手机app开发的几种方式
- jQuery 父iframe与子iframe 相互调用传值
- Yii2 restful api 定制化返回 自己需要的结构
- 【总结】结构化思维