import java.util.concurrent.*;
import java.util.concurrent.locks.*;
public class MaiPiao implements Runnable{
private static int ticket = 100;
synchronized public void get()
{
while(ticket > 0)
{
Thread.yield();
System.out.println (Thread.currentThread().getName() + " : "+ticket);
ticket = ticket - 1;
}
}
public void run()
{
get();
}
public static void main(String[] args) {
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
}
}为什么还能打印出-1,-2来
还有用lock也不对Lock lock = new ReentrantLock();
lock.lock();
.........
lock.unlock();
所以当ticket=0的时候还有没跑干净的线程
而synchronized修饰这个方法和-1,-2一点关系都没有
synchronized修饰后只是可以保证ticket不会出现重复的值
所以要充分理解yield()这个方法
import java.util.concurrent.locks.ReentrantLock;public class MaiPiao implements Runnable {
private static Integer ticket = 100;
static Lock lock = new ReentrantLock();
public void get() {
while (ticket > 0) {
lock.lock();
//synchronized(ticket) {
System.out.println(Thread.currentThread().getName() + " : "
+ ticket);
ticket = ticket - 1;
//}
lock.unlock();
}
} public void run() {
get();
} public static void main(String[] args) {
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
}
}
synchronized(ticket)
这样得不到预想得效果,而要是对其他对象进行锁住却能运行得很好这是为何?
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
应该这样
MaiPiao mp = new MaiPiao();
new Thread(mp).start();
new Thread(mp).start();
new Thread(mp).start();
new Thread(mp).start();
public static int ticket = 100;
public void run() {
while (ticket > 0) {
try{
Thread.sleep(1000);//
//Thread.yield(); 两个都可以
}catch(InterruptedException ee){
ee.printStackTrace();
}
synchronized(this){
if(ticket>0){
System.out.println(Thread.currentThread().getName() + " : "
+ ticket);
ticket-=1;
}
}
} } public static void main(String[] args) {
MaiPiao mp = new MaiPiao();
new Thread(mp).start();
new Thread(mp).start();
new Thread(mp).start();
new Thread(mp).start();
//new Thread(new MaiPiao()).start();
}
}