`

【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();
	}

}
分享到:
评论

相关推荐

    java常见面试题目汇总.doc

    Java是一种广泛使用的面向对象的编程语言,其面试题目通常涵盖了语言基础、面向对象特性、内存管理、集合框架、多线程、异常处理、IO流、网络编程等多个方面。以下是一些常见的Java面试知识点: 1. **super()与 ...

    java经典面试题.doc

    一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以包含多个类,但: - 只有一个公共类,且该类的名字必须与文件名相同。 - 其他类必须是私有的或默认访问权限,并且不能是公共的。 #### 8...

    Java面试题整理

    Java面试题整理主要涵盖了许多Java编程的核心概念...以上只是部分题目涉及的知识点,完整的Java面试题库涵盖了更多主题,如异常处理、多线程、网络编程、JVM内存模型等。准备面试时,全面理解和掌握这些知识点是关键。

    面试编程题

    以下是对给出的一些常见面试题目的详细解析: 1、编程输出一个倒立三角形图: 此题主要考察循环和字符串操作。可以通过嵌套循环实现,外层循环控制行数,内层循环控制每行的星号数量。示例代码使用两种不同的方法...

    java面试题集锦

    以上只是部分题目解析,完整的面试题集锦包含更多内容,如异常处理、多线程、设计模式、集合框架、IO/NIO、数据库操作、JVM优化等方面的知识。这些题目旨在考察Java程序员的基础知识、编程能力和解决问题的能力。

    Java经典面试题大全.doc

    Java是一种广泛使用的面向对象的编程语言,其面试题通常涵盖了语言特性和设计原则等多个方面。以下是一些基于题目描述中的...在实际面试中,可能还会涉及更多如多线程、网络编程、异常处理、集合框架、设计模式等内容。

    java面试题大集合

    #### 七、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以包含多个类,但这些类中只能有一个是公共的(public),且文件名必须与公共类的名称相同。 #### 八、排序都有哪几种方法?请列举...

    Java面试题大全,总结的相当全面的

    Java面试题大全,涵盖了Java编程语言中的核心概念、面向对象特性、内存管理、多线程、集合框架、异常处理、IO流、网络编程等多个方面。以下是对部分题目及其涉及知识点的详细解答: 1. `super()`与`this()`的区别:...

Global site tag (gtag.js) - Google Analytics