package 对象及变量的并发访问2;
/**
* 实例变量非线程安全问题与解决方案
*
* 如果多个线程共同访问一个对象中的实例变量,则可能出现非线程安全问题
* 用线程访问的对象中如果有多个实例变量,则运行的结果可能出现交叉的情况。
*
* 代码没有同步方法,变量出现非线程安全问题 解决——》对addI()方法添加synchronized关键字
*
* 两个线程同时访问同一个对象中的同步方法时,一定是线程安全的。
* 此代码中,由于线程是同步访问的,并且a线程先执行,所以先输出b,后输出a,不管那个线程先运行,
* 这个线程进入用synchronized声明的方法时就会上锁,方法执行完成功后自动解锁,之后下一个线程
* 才会进入用synchronized声明的方法里,不解锁其他线程执行不了用synchronized声明的方法。
*
*/
/**
* 测试
*/
class HasSelfPrivateNumT212 {
private int num=0;
synchronized public void addI(String userName){
try {
if(userName.equals("a")){
num=100;
System.out.println("a set over!");
Thread.sleep(2000);
}else {
num=200;
System.out.println("b set over!");
}
System.out.println(userName+"num="+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ThreadAT212 extends Thread{
private HasSelfPrivateNumT212 numT2212;
public ThreadAT212(HasSelfPrivateNumT212 numT2212){
super();
this.numT2212=numT2212;
}
@Override
public void run() {
super.run();
numT2212.addI("a");
}
}
class ThreadBT212 extends Thread{
private HasSelfPrivateNumT212 numT2212;
public ThreadBT212(HasSelfPrivateNumT212 numT2212){
super();
this.numT2212=numT2212;
}
@Override
public void run() {
super.run();
numT2212.addI("b");
}
}
/**
* 运行
*/
class RunT212 {
public RunT212(){
HasSelfPrivateNumT212 numT2212=new HasSelfPrivateNumT212();
ThreadAT212 at2212=new ThreadAT212(numT2212);
at2212.start();
ThreadBT212 bt2212=new ThreadBT212(numT2212);
bt2212.start();
}
}
public class T2102 {
public static void main(String[] args) {
RunT212 runT212 =new RunT212();
}
}
实例变量非线程安全问题与解决方案——T2102
最新推荐文章于 2023-04-23 15:25:32 发布