Synchronized的一些总结

定义&作用:

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也同步



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值