您的位置:首页 > 其它

Synchronized的一些总结

2018-02-04 17:12 806 查看
定义&作用:

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();
s.service1();
}};t.start();}}

结果:
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也同步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: