HEAD
synchronized(){}一句话: =======
synchronized(){}一句话:
>>>>>>> 593e4ea (添加了SSM)
{}
框起来线程同步代码块,参数填多线程共享的数据
synchronized(this、类名、 字符串 或其他共享的数据){
//线程同步代码块
}
关于
排他锁
,详见死锁与解决
想要哪几个线程共享,就传进去这几个线程所共享的对象!
java 中,任何一个对象都有"一把锁"其实这把锁就是标记(只是把它叫做锁).
比如, t1 线程遇到 synchronized 之后,就会去锁池中寻找这个对象的那把锁,并占有小括号中的那个"共享对象"的那一把锁,然后去执行这个同步代码块.
当 t2 线程遇到 synchronized 之后,也想要占有后面小括号中的"共享对象"的那一把锁,但是已经被 t1 占有了,所以只能等排队等待 t1 线程执行结束后才能执行 t2 线程.在 t1 线程执行结束后会归还这个共享对象的这把锁,然后在外面等待的 t2 线程就会开始执行.
这样就达到了线程排队执行.
打比方
原理类似于:大楼里只有一个洗手间,synchronized 代表几个线程要等线程共享对象的这把锁
这里需要注意的是:共享对象 一定要选好了.
在银行的例子里,对有可能同时操作我这个账户的线程来说,他们必须做到线程同步!!
而对于不操作该账户的线程,它们完全不必要等待。
自己的理解:让同步等待的其他线程的范围不能小,小会出现线程安全问题 也最好不要过大,最好减少不必要的等待。 想要哪几个线程共享,传进去这几个线程的"共享对象"就可以!
synchronized(){} 括号里如果放的是
常量字符串:完全共享
"AAA"
、"abc"
这样的字符串,都在字符串常量池,真的是所有线程共享。无需控制,必会同步
this:最直观的关系 在创建线程时,写哪个账户这个线程就能操作哪个。对应现实当中归属关系,需要谁控制
局部变量:等于没有同步机制,可能出现线程安全问题
详见“扩大同步范围”