您的位置:首页 > 其它

多线程2:线程操作共享数据所引发的问题

2017-05-30 10:57 190 查看
概述:多线程操作共享区域可能会引发线程安全问题,

方式1:没有操作共享数据线程类(不会存在线程安全问题)

package com.thread.n2;

/**
* Created by Zetting on 2017/5/30.
* 没操作共享数据,不存在线程安全问题
*/
public class NotShareSafeMode extends Thread {
private int count = 5;

/**
* 初始化
* @param name
*/
public NotShareSafeMode(String name){
super();
this.setName(name);
}

@Override
public void run(){

while(count > 0 ){
count -- ;
System.out.println(String.format("Thread %s ,the privale count is :%d",
currentThread().getName(),count));
}
}

/**
* 测试类
* @param args
*/
public static void main(String[] args){

/**
* 没有采用操作共享数据线程类
* 所有开启的线程数据都是相互独立的,所有不存在线程安全问题
* **/
NotShareSafeMode notNotShareSafeModeThreadA = new NotShareSafeMode("A");
NotShareSafeMode notNotShareSafeModeThreadB = new NotShareSafeMode("B");
NotShareSafeMode notNotShareSafeModeThreadC = new NotShareSafeMode("C");
NotShareSafeMode notNotShareSafeModeThreadD = new NotShareSafeMode("D");

notNotShareSafeModeThreadA.start();
notNotShareSafeModeThreadB.start();
notNotShareSafeModeThreadC.start();
notNotShareSafeModeThreadD.start();

}

}


运行截图:


方式2:操作共享数据线程类(存在线程安全问题)

package com.thread.n2;

/**
* Created by Zetting on 2017/5/30.
* 有操作共享数据,但 存在线程问题
*/
public class ShareNotSafeMode extends Thread{

/**
* 采用操作共享数据线程类
*/
private int count = 5;
@Override
public void run(){
try {
super.run();
count -- ;
Thread.sleep(500L);
System.out.println(String.format("Thread %s ,the privale count is :%d",
currentThread().getName(), count));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 测试类
* @param args
*/
public static void main(String[] args){
/**操作共享数据线程类**/
ShareNotSafeMode shareSafeMode =new ShareNotSafeMode();
Thread shareThreadA = new Thread(shareSafeMode,"A");
Thread shareThreadB = new Thread(shareSafeMode,"B");
Thread shareThreadC = new Thread(shareSafeMode,"C");
Thread shareThreadD = new Thread(shareSafeMode,"D");
Thread shareThreadE = new Thread(shareSafeMode,"E");

shareThreadA.start();
shareThreadB.start();
shareThreadC.start();
shareThreadD.start();
shareThreadE.start();
}
}


运行截图:


方式3:操作共享数据线程类(不存在线程安全问题)

package com.thread.n2;

/**
* Created by Zetting on 2017/5/30.
* 有操作共享数据,但不存在线程安全问题
*/
public class ShareSafeMode extends Thread{

/**
* 采用操作共享数据线程类*
*/
private int count = 5;
@Override
synchronized public void run(){
try {
super.run();
count -- ;
Thread.sleep(500L);
System.out.println(String.format("Thread %s ,the privale count is :%d",
currentThread().getName(), count));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 测试类
* @param args
*/
public static void main(String[] args){
/**操作共享数据线程类**/
ShareSafeMode shareSafeMode =new ShareSafeMode();
Thread shareThreadA = new Thread(shareSafeMode,"A");
Thread shareThreadB = new Thread(shareSafeMode,"B");
Thread shareThreadC = new Thread(shareSafeMode,"C");
Thread shareThreadD = new Thread(shareSafeMode,"D");
Thread shareThreadE = new Thread(shareSafeMode,"E");

shareThreadA.start();
shareThreadB.start();
shareThreadC.start();
shareThreadD.start();
shareThreadE.start();
}
}


运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 数据 线程
相关文章推荐