基于synchronized的对象锁,类锁以及死锁模拟
来源:互联网 发布:unity3d导出html5 编辑:程序博客网 时间:2024/05/29 13:41
分为对象锁和类锁
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();}}
不同对象 访问类锁测试:
public class clent {public static void main(String[] args) throws Exception {final CountDownLatch c=new CountDownLatch(1);new Thread(new Runnable(){@Overridepublic 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(){@Overridepublic 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*/}
不同对象访问对象锁测试:
public class clent1 {public static void main(String[] args) {final CountDownLatch c=new CountDownLatch(1);new Thread(new Runnable(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName()+"启动");c.await();t1.test1();} catch (Exception e) {e.printStackTrace();}}}).start(); new Thread(new Runnable(){@Overridepublic 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 DoingThread-0启动Thread-1---test1 DoingThread-1--- test2 DoingThread-1---test1 DoingThread-1--- test2 Doing*/}
以上演示的是阻塞等待,下面演示死锁。
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();}}
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(){@Overridepublic void run() {try {c.await();E.testclass();E1.testclass();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();new Thread(new Runnable(){@Overridepublic void run() {try {c.await();E1.testclass();E.testclass();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();c.countDown();}/*执行结果,一直等待Thread-1---E1.method DoingThread-0---E.method Doing*/}
0 0
- 基于synchronized的对象锁,类锁以及死锁模拟
- 对象锁、类锁以及synchronized
- java synchronized的理解以及内置锁和对象锁
- synchronized 类 ,对象 ,以及方法的解析
- Java 对象锁和类锁 死锁(多线程synchronized关键字)
- JAVA中synchronized的使用以及对象锁和类锁的概念
- Java Notes: Synchronized的类锁和对象锁以及谈谈线性安全类
- java 多线程(4) 线程同步之锁(synchronized) / 死锁 / 两个锁定对象期间访问(修改)其变量的面试
- multithreading--synchronized对象锁以及对象的notify(),notifyAll(),wait()等的用法
- synchronized产生的死锁
- day11多线程,run方法。卖票多线程示例。synchronized,同步锁对象,回顾单例。死锁问题
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- java synchronized关键字的用法以及锁的等级:对象锁、类锁
- synchronized的锁对象的特点
- 移动端与pc端公用一个域名
- 网站建设基本流程
- 本地代理服务器 开源
- 最新版本的php 适配ecshop
- 用Eclipse搭建Hadoop2.7.1开发环境
- 基于synchronized的对象锁,类锁以及死锁模拟
- 限制玻尔兹曼机(RBMs)理论详解
- Android LayoutInflater详解
- mongodb常用操作语句
- 源码探索系列1---Handler与HandlerLeak的那些事
- Oracle 11G DataGuard重启详细过程~~
- ios 去掉NavigationBar下面的黑线
- jsp+servlet+sql
- 基于注解的SpringMVC