这段话写于2019年3月6日,这篇文章的理解较为狭隘,我又写了一篇关于synchronized的文章。本来想删掉这篇,但是我写博客的目的是为了记录。又担心其他人看去了被误解,遂说明此情况。
从https://www.cnblogs.com/QQParadise/articles/5059824.html处学习。
(仅供自己学习记录)
例子问题:
select * from student where name = 'john'
如果student表中没有john姓名,则添加。如果有,则不添加。
实际中当两个线程都进入某方法执行到sql语句,因为第一条线程还未执行sql的insert语句,所以两个线程执行sql的结果都为空,故两条线程都会执行sql的insert语句,结果为student表中有两个叫john的人。显然不对。
————————————
解决方法在函数上加锁。
试过
public synchronized void function{
//代码块
}
试过
public void function{
synchronized(this){
//代码块
}
}
结果都是两个线程同时执行代码块。根据以上链接学习总结:
synchronized锁住的是对象,而不是代码块。在实际中每个线程进入函数时,都会对应它自己的一个this对象,故锁住的对象只有当前线程拥有,锁就失去了意义。
正确方法:
class A
{
public void function{
synchronized(A.class)
{
//代码块
}
}
}










网友评论