金山面试题
四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1.....................................
思路:先生成四个线程每个线程的标识符为0,1,2,3;定义一个共享资源count,在线程执行的时候先count%4,结果为几,就是哪个线程执行。当结果为0,1的时候对i做加法,否则做减法运算。
package Second;
import java.io.*;
import java.util.*;
public class jinshan {
/**
* @param args
*/
private static int count;
static int i;
private static Object lock=new Object();
static class Threads implements Runnable{
private int id;
public Threads(int id)
{
this.id=id;
}
public void run()
{
while(true)
{
synchronized(lock)
{
while(id!=count%4){
try{
lock.wait();
}catch(InterruptedException e){}
}
if(id==0||id==1)System.out.println(Thread.currentThread().getName()+" "+ i++ +" ");
if(id==2||id==3) System.out.println(Thread.currentThread().getName()+" "+ i-- +" ");
count++;
lock.notifyAll();
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread a=new Thread(new Threads(0),"a");
Thread b=new Thread(new Threads(1),"b");
Thread c=new Thread(new Threads(2),"c");
Thread d=new Thread(new Threads(3),"d");
a.start();
b.start();
c.start();
d.start();
}
}
Synchronized(this)锁当前对象,两个不同线程持有同一个this执行会锁掉一个
Synchronized(obj)锁Obj对象,this本身就是一个Object对象,而有时候两个线程持有的this本身就不同,你又想同步,可以通过新建一个两个线程共同拥有的对象锁住