package com.tl.skyLine.thread;
import java.util.Date;
/**
* Created by tl on 17/3/3.
*/
public class DeadLock {
public static String bowl = "碗";
public static String chopsticks = "筷子";
public static void main(String[] args) {
LockA la = new LockA();
new Thread(la).start();
LockB lb = new LockB();
new Thread(lb).start();
}
}
class LockA implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "邹保健开始拿餐具吃饭");
while (true) {
synchronized (DeadLock.bowl) {
System.out.println(new Date().toString() + "邹保健抢到了碗");
Thread.sleep(3000); // 此处等待是给B能锁住机会
synchronized (DeadLock.chopsticks) {
System.out.println(new Date().toString() + "邹保健抢到了筷子");
Thread.sleep(60 * 1000); // 为测试,占用了就不放
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class LockB implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "陈顶天开始拿餐具吃饭");
while (true) {
synchronized (DeadLock.chopsticks) {
System.out.println(new Date().toString() + "陈顶天抢到了筷子");
Thread.sleep(3000); // 此处等待是给A能锁住机会
synchronized (DeadLock.bowl) {
System.out.println(new Date().toString() + "陈顶天抢到了碗");
Thread.sleep(60 * 1000); // 为测试,占用了就不放
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Fri Mar 03 16:34:36 CST 2017陈顶天开始拿餐具吃饭 Fri Mar 03 16:34:37 CST 2017陈顶天抢到了筷子 Fri Mar 03 16:34:36 CST 2017邹保健开始拿餐具吃饭 Fri Mar 03 16:34:37 CST 2017邹保健抢到了碗
/**
* Created by tl on 17/3/3.
*/
public class UnDeadLock {
public static String bowl = "碗";
public static String chopsticks = "筷子";
public static void main(String[] args) {
LockA la = new LockA();
new Thread(la).start();
LockB lb = new LockB();
new Thread(lb).start();
}
}
class LockA implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "邹保健开始拿餐具吃饭");
while (true) {
synchronized (UnDeadLock.bowl) {
System.out.println(new Date().toString() + "邹保健抢到了碗");
synchronized (UnDeadLock.chopsticks) {
System.out.println(new Date().toString() + "邹保健抢到了筷子");
}
}
Thread.sleep(5000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class LockB implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "陈顶天开始拿餐具吃饭");
while (true) {
synchronized (UnDeadLock.bowl) {
System.out.println(new Date().toString() + "陈顶天抢到了碗");
synchronized (UnDeadLock.chopsticks) {
System.out.println(new Date().toString() + "陈顶天抢到了筷子");
}
}
Thread.sleep(5000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Fri Mar 24 11:16:51 CST 2017邹保健开始拿餐具吃饭 Fri Mar 24 11:16:51 CST 2017陈顶天开始拿餐具吃饭 Fri Mar 24 11:16:51 CST 2017邹保健抢到了碗 Fri Mar 24 11:16:51 CST 2017邹保健抢到了筷子 Fri Mar 24 11:16:51 CST 2017陈顶天抢到了碗 Fri Mar 24 11:16:51 CST 2017陈顶天抢到了筷子 Fri Mar 24 11:16:56 CST 2017邹保健抢到了碗 Fri Mar 24 11:16:56 CST 2017邹保健抢到了筷子 Fri Mar 24 11:16:56 CST 2017陈顶天抢到了碗 Fri Mar 24 11:16:56 CST 2017陈顶天抢到了筷子 Fri Mar 24 11:17:01 CST 2017邹保健抢到了碗 Fri Mar 24 11:17:01 CST 2017邹保健抢到了筷子
package com.tl.skyLine.thread;
import java.util.Date;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* Created by tl on 17/3/3.
*/
public class UnDeadLock {
public static String bowl = "碗";
//信号量可以碗只能能被一个线程同时访问
public static final Semaphore a1 = new Semaphore(1);
public static String chopsticks = "筷子";
//信号量可以筷子只能能被一个线程同时访问
public static final Semaphore a2 = new Semaphore(1);
public static void main(String[] args) {
LockAa la = new LockAa();
new Thread(la).start();
LockBa lb = new LockBa();
new Thread(lb).start();
}
}
class LockAa implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "邹保健开始拿餐具吃饭");
while (true) {
if (UnDeadLock.a1.tryAcquire(1, TimeUnit.SECONDS)) {
System.out.println(new Date().toString() + "邹保健抢到了碗");
if (UnDeadLock.a2.tryAcquire(1, TimeUnit.SECONDS)) {
System.out.println(new Date().toString() + "邹保健抢到了筷子,凑齐了餐具,准备吃饭");
Thread.sleep(60 * 1000 * 10); // 抢到餐具就开始吃饭,吃饭时间十分钟
} else {
System.out.println(new Date().toString() + "筷子已经被抢走了,邹保健抢筷子失败");
}
} else {
System.out.println(new Date().toString() + "碗已经被抢走了,邹保健抢碗失败");
}
UnDeadLock.a1.release(); // 释放
UnDeadLock.a2.release();
System.out.println(new Date().toString() + "邹保健把抢到的部分餐具又放回原处");
Thread.sleep(1000); // 马上进行尝试,现实情况下do something是不确定的
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class LockBa implements Runnable {
public void run() {
try {
System.out.println(new Date().toString() + "陈顶天开始拿餐具吃饭");
while (true) {
if (UnDeadLock.a2.tryAcquire(1, TimeUnit.SECONDS)) {
System.out.println(new Date().toString() + "陈顶天抢到了筷子");
if (UnDeadLock.a1.tryAcquire(1, TimeUnit.SECONDS)) {
System.out.println(new Date().toString() + "陈顶天抢到了碗,凑齐了餐具,准备吃饭");
Thread.sleep(60 * 1000 * 10); // 抢到餐具就开始吃饭,吃饭时间十分钟
} else {
System.out.println(new Date().toString() + "碗已经被抢走了,陈顶天抢碗失败");
}
} else {
System.out.println(new Date().toString() + "筷子已经被抢走了,陈顶天抢筷子失败");
}
UnDeadLock.a1.release(); // 释放
UnDeadLock.a2.release();
System.out.println(new Date().toString() + "陈顶天把抢到的部分餐具又放回原处");
Thread.sleep(10 * 1000);//这里只是为了演示,所以tryAcquire只用1秒,而且B要给A让出能执行的时间,否则两个永远是死锁
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Fri Mar 03 18:12:07 CST 2017邹保健开始拿餐具吃饭 Fri Mar 03 18:12:07 CST 2017陈顶天开始拿餐具吃饭 Fri Mar 03 18:12:07 CST 2017邹保健抢到了碗 Fri Mar 03 18:12:07 CST 2017陈顶天抢到了筷子 Fri Mar 03 18:12:08 CST 2017筷子已经被抢走了,邹保健抢筷子失败 Fri Mar 03 18:12:08 CST 2017邹保健把抢到的部分餐具又放回原处 Fri Mar 03 18:12:08 CST 2017陈顶天抢到了碗,凑齐了餐具,准备吃饭 Fri Mar 03 18:12:10 CST 2017碗已经被抢走了,邹保健抢碗失败 Fri Mar 03 18:12:10 CST 2017邹保健把抢到的部分餐具又放回原处 Fri Mar 03 18:12:11 CST 2017邹保健抢到了碗 Fri Mar 03 18:12:11 CST 2017邹保健抢到了筷子,凑齐了餐具,准备吃饭
acquire
public void acquire()
throws InterruptedException
从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。
如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态:
某些其他线程调用此信号量的 release() 方法,并且当前线程是下一个要被分配许可的线程;或者
其他某些线程中断当前线程。
如果当前线程:
被此方法将其已中断状态设置为 on ;或者
在等待许可时被中断。
则抛出 InterruptedException,并且清除当前线程的已中断状态。
抛出:
InterruptedException - 如果当前线程被中断
release
public void release()
释放一个许可,将其返回给信号量。释放一个许可,将可用的许可数增加 1。如果任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给予它。然后针对线程安排目的启用(或再启用)该线程。
不要求释放许可的线程必须通过调用 acquire() 来获取许可。通过应用程序中的编程约定来建立信号量的正确用法。
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有