基于synchronized的对象锁,类锁以及死锁模拟
2015-12-07 17:42
225 查看
分为对象锁和类锁
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/d3b74a0428cc45f3b0093532bb5f69c8/clipboard.png)
不同对象 访问类锁测试:
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/0c0a7a13f31d42309eba02fed6362ed6/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/9c7e5f44c783484cbc6d2ba8d42c8a57/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/9c7e5f44c783484cbc6d2ba8d42c8a57/clipboard.png)
不同对象访问对象锁测试:
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/274d4edc26554d08a8cd3c37fa08a591/clipboard.png)
同一个对象,多个线程访问对象锁测试:
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/dd77dd40725845d39408edee7a39a7a6/clipboard.png)
以上演示的是阻塞等待,下面演示死锁。
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/86ddb8d35b014a8c8b26dc6c2962e5bd/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/fa363d0b6ee142428f8d946063065ec2/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/eae626a0b26e46b699f64ceaee4de4d6/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/fb34ce16d09e4e8c9ba7b61276f4621e/clipboard.png)
public class T { public void test1() throws Exception{ synchronized(this){ //对象锁 System.out.println(Thread.currentThread().getName()+"---test1 Doing"); Thread.currentThread().sleep(2000); test2(); }; } public synchronized void test2() throws Exception{ //同test1方法 System.out.println(Thread.currentThread().getName()+"--- test2 Doing"); Thread.currentThread().sleep(2000); test1(); } public void testclass1() throws Exception{ synchronized(T.class){//类锁 System.out.println(Thread.currentThread().getName()+"---testclass1 Doing"); Thread.currentThread().sleep(2000); }; } public static synchronized void testclass2() throws Exception{ //同testclass1方法 System.out.println(Thread.currentThread().getName()+"---testclass2 Doing"); Thread.currentThread().sleep(2000); testclass3(); } public static synchronized void testclass3() throws Exception{ //同testclass1方法 System.out.println(Thread.currentThread().getName()+"---testclass3 Doing"); Thread.currentThread().sleep(2000); testclass2(); } }
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/d3b74a0428cc45f3b0093532bb5f69c8/clipboard.png)
不同对象 访问类锁测试:
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/0c0a7a13f31d42309eba02fed6362ed6/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/9c7e5f44c783484cbc6d2ba8d42c8a57/clipboard.png)
public class clent { public static void main(String[] args) throws Exception { final CountDownLatch c=new CountDownLatch(1); new Thread(new Runnable(){ @Override public void run() { T t1=new T(); try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.testclass3(); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable(){ @Override public void run() { T t1=new T(); try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.testclass2(); } catch (Exception e) { e.printStackTrace(); } } }).start(); c.countDown(); /* 可以发现 类的synchronized一个线程获得不释放,其他线程就不能访问 通过Jconsole可以看到Thread0 一直在等待Thread1 Thread-1启动 Thread-1---testclass2 Doing Thread-0启动 Thread-1---testclass3 Doing Thread-1---testclass2 Doing Thread-1---testclass2 Doing Thread-1---testclass3 Doing*/ }
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/9c7e5f44c783484cbc6d2ba8d42c8a57/clipboard.png)
不同对象访问对象锁测试:
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/274d4edc26554d08a8cd3c37fa08a591/clipboard.png)
public class clent1 { public static void main(String[] args) { final CountDownLatch c=new CountDownLatch(1); new Thread(new Runnable(){ @Override public void run() { T t1=new T(); try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.test1(); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable(){ @Override public void run() { T t1=new T(); try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.test2(); } catch (Exception e) { e.printStackTrace(); } } }).start(); c.countDown(); /* Thread-0启动 Thread-0---test1 Doing Thread-1启动 Thread-1--- test2 Doing */ }
同一个对象,多个线程访问对象锁测试:
public class client2 { public static void main(String[] args) { final CountDownLatch c=new CountDownLatch(1); final T t1=new T(); new Thread(new Runnable(){ @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.test1(); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable(){ @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"启动"); c.await(); t1.test2(); } catch (Exception e) { e.printStackTrace(); } } }).start(); c.countDown(); } /*结果 同一个对象,当其中一个线程没有释放锁时,另一个会一直等待。 Thread-1启动 Thread-1--- test2 Doing Thread-0启动 Thread-1---test1 Doing Thread-1--- test2 Doing Thread-1---test1 Doing Thread-1--- test2 Doing*/ }
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/dd77dd40725845d39408edee7a39a7a6/clipboard.png)
以上演示的是阻塞等待,下面演示死锁。
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/86ddb8d35b014a8c8b26dc6c2962e5bd/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/fa363d0b6ee142428f8d946063065ec2/clipboard.png)
public class E { public static synchronized void testclass() throws Exception{ System.out.println(Thread.currentThread().getName()+"---E.method Doing"); Thread.currentThread().sleep(2000); E1.testclass(); } }
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/eae626a0b26e46b699f64ceaee4de4d6/clipboard.png)
public class E1 { public static synchronized void testclass() throws Exception{ System.out.println(Thread.currentThread().getName()+"---E1.method Doing"); Thread.currentThread().sleep(1000); E.testclass(); } }
public class SiSuo { public static void main(String[] args) { final CountDownLatch c=new CountDownLatch(1); new Thread(new Runnable(){ @Override public void run() { try { c.await(); E.testclass(); E1.testclass(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); new Thread(new Runnable(){ @Override public void run() { try { c.await(); E1.testclass(); E.testclass(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); c.countDown(); } /*执行结果,一直等待 Thread-1---E1.method Doing Thread-0---E.method Doing*/ }
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/fb34ce16d09e4e8c9ba7b61276f4621e/clipboard.png)
![](file:///C:/Users/zhangpc/AppData/Local/YNote/Data/zhangpc_0906@163.com/3e88cc289f334270b95b1772cfe5dd0e/clipboard.png)
相关文章推荐
- 平安直通资讯系统
- Angular 学习笔记——自定义指令之间的交互
- mongodb常用操作语句
- Android LayoutInflater详解
- 关于list的addAll方法
- netbeans 8.0.2 卡在 refresh indices 或者 background scanning of projects
- requestWindowFeature()应用
- glibc 安装( version `GLIBC_2.14' not found")
- LoadRunner脚本 《第二篇》
- java面向对象主要有四大特性
- 最新版本的php 适配ecshop
- 限制玻尔兹曼机(RBMs)理论详解
- Android UI 之自定义RadarView——高仿微信雷达扫描
- 用Eclipse搭建Hadoop2.7.1开发环境
- NSRunLoop Demo
- 本地代理服务器 开源
- mysql知识一天一收获
- 网站建设基本流程
- 博客说明
- LoadRunner用户行为模拟器 《第三篇》