您的位置:首页 > 编程语言 > Java开发

java多线程 对volatile理解 第四天

2016-10-24 15:30 281 查看
问题由来 测试下面代码发现结果死循环

package com.company.javaThreadTest;

/**
* Created by likailong on 2016/10/24.
* 分析出现死循环原因 原因是main线程一直在处理while 执行不到后面结果
*/
public class VolatileThread {
private boolean isContinuePrint=true;
public boolean isContinuePrint(){
return isContinuePrint;
}
public void setContinuePrint(boolean continuePrint){
this.isContinuePrint=continuePrint;
}
public void printStringMethod(){
try{
while (isContinuePrint==true){
System.out.println("run printStringmethod threadname="+Thread.currentThread().getName());
Thread.sleep(1000);
}}catch (InterruptedException e){
e.printStackTrace();
}
}
public static void main(String [] args){
VolatileThread v=new VolatileThread();
v.printStringMethod();
System.out.println("我要停止他");
v.setContinuePrint(false);
v.printStringMethod();
}
}
解决方法加volatile关键字
package com.company.javaThreadTest;

/**
* Created by likailong on 2016/10/24.
* Volatile强制从堆栈取值
* volatile与synchrnized比较
* volatile是线程同步轻量级实现,所以性能比synchrnized好
* 而且只能修饰变量,而synchrnized可以修饰方法 代码块 对着新版本发布synchrnized会在执行上效率得到提升
* 多线程访问volatile不会发生阻塞 而synchrnized会
* volatile能保证数据的可见性但不能保证原子性 而synchrnized可以保证原子性也可以间接保证可见性 因为它会将私有的
* 内存和公共内存做同步。
* volatile 解决的是变量在多个线程可见性,而synchrnized解决多个线程访问资源的同步性
*/
public class VolatileThread1 implements Runnable {
private boolean isContinuePrint=true;
public boolean isContinuePrint(){
return isContinuePrint;
}
public void setContinuePrint(boolean continuePrint){
this.isContinuePrint=continuePrint;
}
public void printStringMethod(){
try{
while (isContinuePrint==true){
System.out.println("run printStringmethod threadname="+Thread.currentThread().getName());
Thread.sleep(1000);
}}catch (InterruptedException e){
e.printStackTrace();
}
}
@Override
public void run() {
printStringMethod();
}
public static void main(String args[]){
VolatileThread1 volatileThread1=new VolatileThread1();
new Thread(volatileThread1).start();
System.out.println("我要停止他");
volatileThread1.setContinuePrint(false);
volatileThread1.printStringMethod();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: