定义&作用:
Synchronized使得多线程环境下在同一时刻只有一个线程进入到临界区(Synchronized修饰的方法\代码块),同时保证保证共享变量的可见性(同步线程工作变量的私有变量和公共内存的变量)
作用范围:
普通方法,锁对象是类中方法
静态同步,锁对象是静态方法==Synchronized(类名.class){代码}
代码块,锁对象是Synchrnoized(锁对象可以使this,变量)
特性:
保证原子性和可见性。
是可重入锁:当一个线程得到一个对象锁后,再次请求对象锁时还是可以再次得到该对象的锁,代码:
public class SynchronizedTest { synchronized public void service1(){ System.out.println("service1"); service2(); } synchronized public void service2(){ System.out.println("service2"); service3(); } synchronized public void service3(){ System.out.println("service3"); //service(); } public static void main(String[] args) { Thread t=new Thread(){ @Override public void run() { // TODO Auto-generated method stub
SynchronizedTest s=new SynchronizedTest();
}};t.start();}} 结果:s.service1();
出现异常,锁自动释放service1 service2 service3
同步不具备继承性
多个对象多个锁,Synchronized(String s),如果每个线程传入的string对象是不同的,则不会同步执行(同步就是一个线程会等待一个线程先执行完毕,才执行。)
在类中存在Set和get方法,如果只是对set进行synchronized,在读数据时候会有可能出现脏数据(就是set中有多个值要赋值,但只赋值了一部分,就get读了出来)
例子
string s1="a",s2="b";
synchronized set(){
s1=aa;
s2=bb;
}
get(){println(s1,s2)}
有可能只是对s1赋值了为aa,但s2还没有,读出来数据为aa,b 脏数据解法是get也同步