概述:多线程操作共享区域可能会引发线程安全问题,
方式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();
}
}
运行截图: