sychronized同步方法
非线程安全是多个线程对同一个对象中的实例变量进行并发访问时发生,就会产生脏读,而线程安全获得的实例变量的值是经过同步处理的,不会出现脏读的情况。
方法内的实例变量为线程安全
public class MyThread extends Thread {
private SyschronizedObject object;
public MyThread(SyschronizedObject object) {
super();
this.object = object;
}
@Override
public void run() {
super.run();
object.setValue("a");
}
}
public class MyThread2 extends Thread {
private SyschronizedObject object;
public MyThread2(SyschronizedObject object) {
super();
this.object = object;
}
@Override
public void run() {
super.run();
object.setValue("b");
}
}
public class SyschronizedObject {
public void setValue(String username) {
int num = 0;
if (username.equals("a")) {
num = 100;
System.out.println("username = "+ username+ "num ="+ num);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
num = 200;
System.out.println("username = "+ username+ "num ="+ num);
}
}
}
public class TestMyThread {
//
public static void main(String[] args) {
SyschronizedObject object = new SyschronizedObject();
MyThread thread1 = new MyThread(object);
thread1.start();
MyThread2 thread2 = new MyThread2(object);
thread2.start();
}
}
运行结果:
username = anum =100
username = bnum =0
可见方法内的变量永远是线程安全的,这是方法内部的变量是私有的造成的。
实例变量非线程安全
如果多线程同时访问同一个对象的实例变量,会出现非线程安全问题。
用线程访问的对象中,实例变量有多个值,运行的结果会出现交叉的情况。
public class SyschronizedObject {
private int num = 0;
public void setValue(String username) {
if (username.equals("a")) {
num = 100;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
num = 200;
}
System.out.println("username = "+ username+ " num ="+ num);
}
}
public class MyThread extends Thread {
private SyschronizedObject object;
public MyThread(SyschronizedObject object) {
super();
this.object = object;
}
@Override
public void run() {
super.run();
object.setValue("a");
}
}
public class MyThread2 extends Thread {
private SyschronizedObject object;
public MyThread2(SyschronizedObject object) {
super();
this.object = object;
}
@Override
public void run() {
super.run();
object.setValue("b");
}
}
public class TestMyThread {
public static void main(String[] args) {
SyschronizedObject object = new SyschronizedObject();
MyThread thread1 = new MyThread(object);
thread1.start();
MyThread2 thread2 = new MyThread2(object);
thread2.start();
}
}