Java多线程安全的实现
2018-02-07 16:24
316 查看
多线程的安全1.锁对象reenTranLockclass X {
private static final ReentrantLock lock = new ReentrantLock();
// 其他变量的定义
public void m() {
lock.lock(); // 当试图获得锁时,如果锁已经被别的线程占有,那么该线程会一直被阻塞,直到获得锁
try {
// 处理数据
} finally {
lock.unlock(); //释放锁
}
}
}1.1临界区:需要线程安全的区域
Condition Java中提供了条件对象,Condition类,来配合ReentrantLock实现对临界区的控制。
public class X {
private ReentrantLock lock = new ReentrantLock();
private Condition condition;
public X() {
condition = lock.newCondition();
}
public void transfer(int from, int to, double amount) {
lock.lock();
try {
/*
* 当达到条件时
* await()会阻塞线程,并释放线程保持的锁,这时其他的线程就可以进入临界区
* signalAll()方法唤醒所有因为不满足条件而等待的线程,但是线程不一定能够继续向下执行
* */
while (//条件)
condition.await();
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}2.synchronized关键字修饰方法public class X {
public synchronized void test1(){
}
public void test2(){
synchronized(this){
}
}
}
3.volatile关键字volatile修饰: 第一:使用volatile关键字会强制将修改的值立即写入主存; 第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效; 第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。4.线程的状态
4.线程的状态
private static final ReentrantLock lock = new ReentrantLock();
// 其他变量的定义
public void m() {
lock.lock(); // 当试图获得锁时,如果锁已经被别的线程占有,那么该线程会一直被阻塞,直到获得锁
try {
// 处理数据
} finally {
lock.unlock(); //释放锁
}
}
}1.1临界区:需要线程安全的区域
Condition Java中提供了条件对象,Condition类,来配合ReentrantLock实现对临界区的控制。
public class X {
private ReentrantLock lock = new ReentrantLock();
private Condition condition;
public X() {
condition = lock.newCondition();
}
public void transfer(int from, int to, double amount) {
lock.lock();
try {
/*
* 当达到条件时
* await()会阻塞线程,并释放线程保持的锁,这时其他的线程就可以进入临界区
* signalAll()方法唤醒所有因为不满足条件而等待的线程,但是线程不一定能够继续向下执行
* */
while (//条件)
condition.await();
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}2.synchronized关键字修饰方法public class X {
public synchronized void test1(){
}
public void test2(){
synchronized(this){
}
}
}
3.volatile关键字volatile修饰: 第一:使用volatile关键字会强制将修改的值立即写入主存; 第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效; 第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。4.线程的状态
4.线程的状态
相关文章推荐
- Java中实现多线程并发的几种安全机制
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- 多线程安全的Singleton单件模式在C++,java与C#下的实现
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 用JAVA的多线程实现火车站售票问题
- 在Java中实现多线程
- Windows Forms实现安全多线程(附例码)
- Java安全有效的实现两星期内自动登陆功能
- 在Servlet和JSP中如何实现多线程安全
- [原创] Windows Forms 实现安全的多线程详解(附带程序代码示例)
- 电子商务的安全分析、设计及JAVA实现
- java Thread:利用Thread类实现多线程
- 用JAVA的多线程实现银行取款的问题
- Java实现多线程的两种方式
- 实现 Java 多线程并发控制框架
- 多线程安全的单件模式,模板基类的单件实现
- 如何正确实现多线程安全的singleton patterns
- 关于这java类实现多线程的困惑
- servlet如何实现多线程安全??
- Windows Forms 实现安全的多线程详解(附带程序代码示例)