设计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是一种广泛使用的面向对象的编程语言,其面试题目通常涵盖了语言基础、面向对象特性、内存管理、集合框架、多线程、异常处理、IO流、网络编程等多个方面。以下是一些常见的Java面试知识点: 1. **super()与 ...
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以包含多个类,但: - 只有一个公共类,且该类的名字必须与文件名相同。 - 其他类必须是私有的或默认访问权限,并且不能是公共的。 #### 8...
Java面试题整理主要涵盖了许多Java编程的核心概念...以上只是部分题目涉及的知识点,完整的Java面试题库涵盖了更多主题,如异常处理、多线程、网络编程、JVM内存模型等。准备面试时,全面理解和掌握这些知识点是关键。
以下是对给出的一些常见面试题目的详细解析: 1、编程输出一个倒立三角形图: 此题主要考察循环和字符串操作。可以通过嵌套循环实现,外层循环控制行数,内层循环控制每行的星号数量。示例代码使用两种不同的方法...
以上只是部分题目解析,完整的面试题集锦包含更多内容,如异常处理、多线程、设计模式、集合框架、IO/NIO、数据库操作、JVM优化等方面的知识。这些题目旨在考察Java程序员的基础知识、编程能力和解决问题的能力。
Java是一种广泛使用的面向对象的编程语言,其面试题通常涵盖了语言特性和设计原则等多个方面。以下是一些基于题目描述中的...在实际面试中,可能还会涉及更多如多线程、网络编程、异常处理、集合框架、设计模式等内容。
#### 七、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以包含多个类,但这些类中只能有一个是公共的(public),且文件名必须与公共类的名称相同。 #### 八、排序都有哪几种方法?请列举...
Java面试题大全,涵盖了Java编程语言中的核心概念、面向对象特性、内存管理、多线程、集合框架、异常处理、IO流、网络编程等多个方面。以下是对部分题目及其涉及知识点的详细解答: 1. `super()`与`this()`的区别:...