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
结果:
同步不具备继承性
多个对象多个锁,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也同步
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也同步
相关文章推荐
- Android synchronized的一些总结
- jquery的一些技巧总结
- 总结一下DLL声明的一些问题
- 处理bug的一些经验总结
- Objective-C的self.用法的一些总结
- JavaScript的一些基本方法总结
- java List转换为字符串并加入分隔符的一些方法总结
- PHP代码优化的一些技巧总结
- 对于最近的一些日常总结by520(17.10.18)
- C++容器的一些总结
- 今天看了一些汇编,学了点基础,记录并总结下
- tomcat安装的一些错误总结
- 遇到的一些doc命令总结
- 对synchronized(this)的一些理解
- 对近期使用Nhibernate开发的一个项目的一些总结(一)
- 程序员总结:帮助你早些明白一些道理
- [导入]关于ASPNET在IIS一些问题的经验总结
- 写程序的一些Debug总结
- Android中Surface和SurfaceView的一些理解和总结