/*用Runnable接口实现线程的好处
* 1、避免了实现类单继承的局限性(实现了Runnable接口,还可以继承其它的类,实现其它的接口使用)
*2、降低了设置线程任务和执行线程之间的耦合性,增强了扩展性能够解释安全问题的出现的原因
*
*
*
* */
public class TestRunnable implements Runnable{
private int shared=10;
Lock l = new ReentrantLock();
@Override
public void run() {
// show01();
sho02();
// show03();
}
/*以带有synchronied关键字的方法限制进程共享资源冲突*/
private synchronized void show03() {
while(true){
if (shared>0){
System.out.println(Thread.currentThread().getName()+": "+shared);
shared--;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*通过synchronized代码同步块一this为锁实现限制进程共享资源冲突
* this为当前对象
* 如果方法为静态方法,如private static void sho02(),那么锁就只能以该类的class对象(TestRunnable.class)
* */
private void sho02() {
while(true){
synchronized (this){
if (shared>0){
System.out.println(Thread.currentThread().getName()+": "+shared);
shared--;
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*用Lock锁来限制进程共享资源冲突*/
private void show01() {
while(true){
l.lock();
if (shared>0){
System.out.println(Thread.currentThread().getName()+": "+shared);
}
l.unlock();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
shared--;
}
}
}
TestRunnable trb=new TestRunnable();
Thread t1 = new Thread(trb);
Thread t2 = new Thread(trb);
Thread t3 = new Thread(trb);
t1.start();
t2.start();
t3.start();