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

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.
似乎自己写的程序没有进行同步,所以j的计数会有问题。
回家之后再重新写了这个程序。
用了synchronized同步。 另外一种方法采用lock进行同步。
一下是程序。
[b]使用同步方法进行[/b]
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();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值