基于synchronized的对象锁,类锁以及死锁模拟

基于synchronized的对象锁,类锁以及死锁模拟

分为对象锁和类锁

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(){

@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*/

}

不同对象访问对象锁测试:

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*/}

以上演示的是阻塞等待,下面演示死锁。

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(){

@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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栾还是恋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值