【线程】Java线程(3)-线程安全解决方案(加锁机制)Atomic && synchronized
2014-04-25 16:47
507 查看
1、通过加锁机制,限制不同线程对同一资源的访问;
1)、Atomic
在java.util.concurrent.atomic有一些具体的类,如AtomicInteger,对该类型的数据做了原子性操作。具体的实现基于CAS,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。这个操作有可能出现ABA的问题,这里有不展开讨论了。
以在ATM机同时取现和存钱举例。
具体操作类ModifyNum.java
Java中关键字,独占锁,悲观锁。可以作用的方法上,也可以作用在方法块上,保证同一时刻只能有一个线程来访问该关键字作用的代码。
以在ATM机同时取现和存钱举例。
具体操作类ModifyNum.java
1)、Atomic
在java.util.concurrent.atomic有一些具体的类,如AtomicInteger,对该类型的数据做了原子性操作。具体的实现基于CAS,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。这个操作有可能出现ABA的问题,这里有不展开讨论了。
以在ATM机同时取现和存钱举例。
具体操作类ModifyNum.java
public class ModifyNum { private AtomicInteger totalNum; public ModifyNum(AtomicInteger totalNum) { super(); this.totalNum = totalNum; } public void addNum() { totalNum.addAndGet(100); System.out.println(Thread.currentThread().getName() + "-当前数量值为:" + totalNum); } public void delNum() { totalNum.addAndGet(-500); System.out.println(Thread.currentThread().getName() + "-当前数量值为:" + totalNum); } }测试类Main.java
public class Main { public static void main(String[] args) { final ModifyNum modifyNum = new ModifyNum(new AtomicInteger(1000)); new Thread("add"){ public void run(){ modifyNum.addNum(); } }.start(); new Thread("del"){ public void run(){ modifyNum.delNum(); } }.start(); } }可能的输出:
add-当前数量值为:1100 del-当前数量值为:600 del-当前数量值为:100 add-当前数量值为:200 del-当前数量值为:-300 add-当前数量值为:-200 del-当前数量值为:-700 add-当前数量值为:-600 del-当前数量值为:-1100 add-当前数量值为:-10002)、synchronized
Java中关键字,独占锁,悲观锁。可以作用的方法上,也可以作用在方法块上,保证同一时刻只能有一个线程来访问该关键字作用的代码。
以在ATM机同时取现和存钱举例。
具体操作类ModifyNum.java
public class ModifyNum { private int totalNum; public ModifyNum(int totalNum) { super(); this.totalNum = totalNum; } public void addNum() { synchronized (this) { totalNum += 100; System.out.println(Thread.currentThread().getName() + "-当前数量值为:" + totalNum); } } public synchronized void delNum() { totalNum -= 500; System.out.println(Thread.currentThread().getName() + "-当前数量值为:" + totalNum); } }测试类Main.java
public class Main { public static void main(String[] args) { final ModifyNum modifyNum = new ModifyNum(1000); for (int i = 0; i < 5; i++) { new Thread("add"){ public void run(){ modifyNum.addNum(); } }.start(); new Thread("del"){ public void run(){ modifyNum.delNum(); } }.start(); } } }可能的输出:
add-当前数量值为:1100 del-当前数量值为:600 del-当前数量值为:100 add-当前数量值为:200 del-当前数量值为:-300 del-当前数量值为:-800 del-当前数量值为:-1300 add-当前数量值为:-1200 add-当前数量值为:-1100 add-当前数量值为:-1000虽然线程执行顺序仍然是不固定的,但是加入synchronized限制之后,同一时刻只有一个线程访问当前代码块,使得最后的结果和预期一致。
相关文章推荐
- 【Java线程】锁机制:synchronized、Lock、Condition(转)
- 【Java线程】锁机制:synchronized、Lock、Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- 【Java线程】锁机制:synchronized、Lock、Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java线程---锁机制:synchronized、Lock、Condition
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java线程同步机制synchronized关键字的理解
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java线程同步机制synchronized关键字的理解
- Java synchronized同步线程机制(二)
- 【Java线程】锁机制:synchronized、Lock、Condition
- 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference
- Java线程通信与协作的解决方案——等待/通知机制
- Android 价值千万java多线程同步 <四> synchronized&Lock&Atomic6种方式
- java学习初探十八之线程的线程同步_锁机制_synchronized
- Java synchronized同步线程机制(一)