摘要: volatile volatile关键字的主要作用是使变量在多个线程间可见 使用方法: private volatile int number=0; 图示: 两个线程t1和t2共享一份数据,int a=0,但是两个线程间是不可见的,t1修改a=10,但对于t2来说a还是从0变到20,两个线程是独立的 阅读全文
posted @ 2019-12-04 15:25 Curedfisher 阅读(160) 评论(0) 推荐(0) 编辑
摘要: volatile volatile关键字的主要作用是使变量在多个线程间可见 使用方法: private volatile int number=0; 图示: 两个线程t1和t2共享一份数据,int a=0,但是两个线程间是不可见的,t1修改a=10,但对于t2来说a还是从0变到20,两个线程是独立的 阅读全文
posted @ 2019-12-04 11:47 Curedfisher 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 1.synchronized可以使用任意的Object进行加锁,用法比较灵活 另外特别注意一个问题,就是不要使用String常量加锁,会出现死循环 输出结果: 永远都是t1开始,t1结束,没有t2什么事,这是什么原因呢? String在常量池中只有一个引用,所以尽量不要用字符串常量去加锁 可以采用如 阅读全文
posted @ 2019-12-04 10:23 Curedfisher 阅读(209) 评论(0) 推荐(0) 编辑
摘要: synchronized锁重入: 关键字synchronized拥有锁重入的功能,也就是使用synchronized时,当一个线程得到了一个对象的锁后,再次请求此对象时是可以再次得到对象的锁. 输出结果: method1方法加了synchronized了,在method1()方法中调用加synchr 阅读全文
posted @ 2019-12-04 09:31 Curedfisher 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 脏读: 对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,很经典的错误就是脏读. 首先是主线程,走着走着出现一个t1线程,t1执行run方法,调用setValue();主线程1秒的时候调了getValue()方法; 从上面看,在t1线程2秒内 阅读全文
posted @ 2019-12-04 08:40 Curedfisher 阅读(103) 评论(0) 推荐(0) 编辑