java 如何判断对象被其他线程锁住 RT,不知道怎么判断? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我估计想多了用Lock应该可以package pkg;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class TestLock { private Lock lock = new ReentrantLock(); /** * @param args */ public static void main(String[] args) { final TestLock instance = new TestLock(); Thread t1 = new Thread(new Runnable() { @Override public void run() { boolean tryLock = instance.lock.tryLock(); if (tryLock) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(1); instance.lock.unlock(); } else { System.out.println(2); } } });// t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { boolean tryLock = instance.lock.tryLock(); if (tryLock) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(3); instance.lock.unlock(); } else { System.out.println(4); } } }); t2.start(); t1.start();// t2.start(); }} import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ConcurrentHashMap;public class ObjectLockJudgement { private static final ConcurrentHashMap<Object, Thread> relation = new ConcurrentHashMap<Object, Thread>(); /** * @param args */ public static void main(String[] args) { final int threadNumber = 100; List<Object> lockers = new ArrayList<Object>(threadNumber); for (int i = 0; i < threadNumber; i++) { final Object locker = new Object(); lockers.add(locker); new ThreadImpl(locker); } while (!relation.isEmpty()) { for (final Object locker : lockers) { final Thread t = relation.get(locker); if (t != null) System.out.println("the locker Object:" + locker.hashCode() + " is held by thread:" + t.getName()); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } static class ThreadImpl extends Thread { private Object locker; private static final Random r = new Random(); public ThreadImpl(Object locker) { this.locker = locker; this.start(); } @Override public void run() { try { synchronized (locker) { relation.put(locker, Thread.currentThread()); try { Thread.sleep(r.nextInt(10000)); } catch (InterruptedException e) { e.printStackTrace(); } } } finally { relation.remove(locker); } } }}以上代码是将locker和thread做关联,可以得到object 锁对应的thread。但是我不知道判断的目的是什么,因为ReentrantLock的try locker,可以应该大的你相同的目的,而且不需要判断。 帮帮我,急急! 插件开发-->高分求一居中算法! 2007年最新技术 连接SQLServer的问题,为什么提示java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver 怎么样才能打开一个JPG文件 java可以读取出word等文件的摘要信息嘛? double 类型能不能不用科学计数法来实现! java写文件乱码问题 变鼠标形状 java开发手机发短信的程序 帮忙写个小算法 package问题
用Lock应该可以
package pkg;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class TestLock { private Lock lock = new ReentrantLock();
/**
* @param args
*/
public static void main(String[] args) {
final TestLock instance = new TestLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
boolean tryLock = instance.lock.tryLock();
if (tryLock) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(1);
instance.lock.unlock();
} else {
System.out.println(2);
}
}
});
// t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
boolean tryLock = instance.lock.tryLock();
if (tryLock) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(3);
instance.lock.unlock();
} else {
System.out.println(4);
}
}
});
t2.start();
t1.start();
// t2.start();
}}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;public class ObjectLockJudgement { private static final ConcurrentHashMap<Object, Thread> relation = new ConcurrentHashMap<Object, Thread>(); /**
* @param args
*/
public static void main(String[] args) {
final int threadNumber = 100; List<Object> lockers = new ArrayList<Object>(threadNumber);
for (int i = 0; i < threadNumber; i++) {
final Object locker = new Object();
lockers.add(locker);
new ThreadImpl(locker);
} while (!relation.isEmpty()) {
for (final Object locker : lockers) {
final Thread t = relation.get(locker);
if (t != null)
System.out.println("the locker Object:" + locker.hashCode()
+ " is held by thread:" + t.getName());
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} static class ThreadImpl extends Thread {
private Object locker;
private static final Random r = new Random(); public ThreadImpl(Object locker) {
this.locker = locker;
this.start();
} @Override
public void run() {
try {
synchronized (locker) {
relation.put(locker, Thread.currentThread());
try {
Thread.sleep(r.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
relation.remove(locker);
}
}
}}以上代码是将locker和thread做关联,可以得到object 锁对应的thread。
但是我不知道判断的目的是什么,因为ReentrantLock的try locker,可以应该大的你相同的目的,而且不需要判断。