`

【java多线程】昨天的一个面试题目

    博客分类:
  • java
 
阅读更多
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
似乎自己写的程序没有进行同步,所以j的计数会有问题。 
回家之后再重新写了这个程序。
用了synchronized同步。  另外一种方法采用lock进行同步。
一下是程序。
使用同步方法进行
package com.duduli.li;

public class Test2 {
	static int j=100;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test2 t = new Test2();
		Inc t1 = t.new Inc();
		Inc t2 = t.new Inc();
		Dec t3 = t.new Dec();
		Dec t4 = t.new Dec();
		new Thread(t1).start();
		new Thread(t2).start();
		new Thread(t3).start();
		new Thread(t4).start();
//		System.out.println(j);
	}
	
//	需要对方法进行同步。否则会出现问题。
	private synchronized void add() {
		j++;
		System.out.println("+   " + j);
		}

	private synchronized void minus() {
		j--;
		System.out.println("-   " + j);
		}
		
	class Inc implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			add();
			
		}
		
	}
	
	
	class Dec implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			minus();
			
		}
		
	}

}



另外采用lock的方法是:
package com.duduli.li;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Test3 extends Thread{
	int flag;
	public Test3(int flag){
		this.flag = flag;
	}
	public static Lock lock = new ReentrantReadWriteLock().writeLock();
    static int j = 100;

	@Override
	public void run() {
		// TODO Auto-generated method stub
	    if(flag==1){
	         lock.lock();
	         j++;
	         System.out.println("+  "+j);
	         lock.unlock();
	    }

	    if(flag==0){
	        lock.lock();
	        j--;
	        System.out.println("-  "+j);
	        lock.unlock();
	    }
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Test3(0).start();
		new Test3(0).start();
		new Test3(1).start();
		new Test3(1).start();
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics