简介
以前在学习多线程,一直有个意识就是只需要对修改做同步,但是今天看了一个博客发现其实并不是那么回事,具体同步哪一块儿代码需要根据业务逻辑来定。
示例代码(摘录网上的代码做了简单修改)
public class Threadtest {
public static void main(String[] args) throws InterruptedException {
MyTestObjectOne myTestObjectOne = new MyTestObjectOne();
ThreadOne threadTwo = new ThreadOne(myTestObjectOne);
Thread thread = new Thread(threadTwo);
thread.start();
System.out.println("id:" + myTestObjectOne.getId() + " name:"
+ myTestObjectOne.getName());
Thread.currentThread().sleep(2000);
System.out.println("id:" + myTestObjectOne.getId() + " name:"
+ myTestObjectOne.getName());
Thread.currentThread().sleep(2000);
System.out.println("id:" + myTestObjectOne.getId() + " name:"
+ myTestObjectOne.getName());
}
}
class ThreadOne implements Runnable {
private MyTestObjectOne myTestObjectOne;
public ThreadOne(MyTestObjectOne myTestObjectOne) {
this.myTestObjectOne = myTestObjectOne;
}
@Override
public void run() {
try {
Thread.currentThread().sleep(100);
myTestObjectOne.setId(1);
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
}
myTestObjectOne.setName("ray");
}
}
class MyTestObjectOne {
private int id = 0;
private String name = "init";
public int getId() {
return id;
}
public synchronized void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public synchronized void setName(String name) {
this.name = name;
}
}
执行结果
由执行结果可知
1:synchronized修饰的方法并不是原子性的,一个synchronized块当中执行到一半被修改的数据可以被其他线程使用,假设业务需要synchronize中的代码整体具有原子性,这个时候就需要做其他修改。
2:借助于第一点,说明在多线程同步当中不只是同步数据修改部分的代码,有些业务需求获取数据的代码也需要同步,具体要怎么同步看业务需求。