62,614
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
Lock lock = new ReentrantLock(false);
ExecutorService pool = Executors.newCachedThreadPool();
Runnable t1 = new MyCountA("张三", 1000, lock);
Runnable t2 = new MyCountA("李四", -1000, lock);
Runnable t3 = new MyCountA("王五", 5000, lock);
Runnable t4 = new MyCountA("赵六", -6000, lock);
Runnable t5 = new MyCountA("阿大", 8000, lock);
Runnable t6 = new MyCountA("阿三", -9000, lock);
pool.execute(t6);
pool.execute(t5);
pool.execute(t4);
pool.execute(t3);
// pool.execute(t2);
// pool.execute(t1);
pool.shutdown();
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyCountA implements Runnable
{
private static AtomicLong along =new AtomicLong(10000); // 为什么这里要加static
//public static Long along=(long)10000 ; // 为什么这里要加static
private String name;
private int x;
private Lock lock;
public MyCountA(String name, int x, Lock lock) throws InterruptedException
{
this.name = name;
this.x = x;
this.lock = lock;
}
public synchronized void run()
{
//lock.lock();
//along+=x;
along.addAndGet(x);
System.out.println(name+"操作金额:"+x+"账户余额:"+(along));
//lock.unlock();
}
public static void main(String[] args) throws InterruptedException
{
Lock lock = new ReentrantLock(false);
MyCountA t1 = new MyCountA("张三", 1000, lock);
MyCountA t2 = new MyCountA("李四", -1000, lock);
MyCountA t3 = new MyCountA("王五", 5000, lock);
MyCountA t4 = new MyCountA("赵六", -6000, lock);
MyCountA t5 = new MyCountA("阿大", 8000, lock);
MyCountA t6 = new MyCountA("阿三", -9000, lock);
ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(t6);
pool.execute(t5);
pool.execute(t4);
pool.execute(t3);
pool.execute(t2);
pool.execute(t1);
pool.shutdown();
Thread.sleep(1000);
System.out.println(MyCountA.along);
}
}
public class MyCountA implements Runnable
{
private AtomicLong along = null;
...
public MyCountA(String name,int x,Lock lock, AtomicLong along){
this.name = name;
this.x = x;
this.lock = lock;
this.along = along;
}
...
}
public class TestM{
public static void main(String[] args){
Lock lock = new ReentrantLock(false);
AtomicLong along = new AtomicLong(10000);
ExecutorService pool = Executors.newCachedThreadPool();
Runnable t1 = new MyCountA("张三", 1000, lock, along);
Runnable t2 = new MyCountA("李四", -1000, lock, along);
...
}
Thread.sleep(1000);
System.out.println(MyCountA.along);
软件包 java.util.concurrent.atomic 的描述
类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将 volatile 值、字段和数组元素的概念扩展到那些也提供原子条件更新操作的类,其形式如下:
boolean compareAndSet(expectedValue, updateValue);
如果此方法(在不同的类间参数类型也不同)当前保持 expectedValue,则以原子方式将变量设置为 updateValue,并在成功时报告 true。此包中的类还包含获取并无条件设置值的方法,以及以下描述的较弱条件的原子更新操作 weakCompareAndSet。
这些方法的规范使实现能够使用当代处理器上提供的高效机器级别原子指令。但是在某些平台上,该支持可能需要某种形式的内部锁。因而,该方法不能严格保证不被阻塞 - 执行操作之前可能暂时阻塞线程。
...
private static AtomicLong along = new AtomicLong(10000); //为什么这里要加static