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