Java笔记2.1--线程之synchronized

要点:

1.通过线程内存模型,展示线程安全方面的技能。

2.能在面试中说出Synchronized和各种锁的使用要点。

3.能在面试中展示各种线程同步和并发技能。

3.讲述ConcurrentHashMap对象的底层代码,展示锁,volatile,并发控制和集合方面的技能。

 

public class ThreadSafeDemo {
    public static void main(String[] args){
        List unsafeList = new ArrayList();
        List safeList = Collections.synchronizedList(new ArrayList());
    }
}

分別为线程不安全和线程安全,当创建一个线程池,执行1000次插入链表时,不安全的最终大小可能就比1000小,安全的一定是一样大的。

原因:两个线程读取了同样的驻村数据,放入线程内存,在各自加载后后都再次刷新放入主内存,但是两者一定会有一个覆盖另外一个。

线程不安全对象:ArrayList,LinkedList,HashMap,StringBuilder

线程安全对象:Vector,HashTable,StringBuffer

把List类包装成线程安全:Connections.synchronizedList(List)

把set类包装成线程安全:Connections.synchronizedSet(set)

把HashMap类包装秤线程安全:Connections.synchronizedMap(map)

为了保证线程安全,会牺牲效率,所以单线程下最好用线程不安全的。

介绍项目时提到,开发中尽量使用线程不安全的对象,效率更高。结合内存模型讲述线程不安全的原因,讲述会发生的问题。

如何将list变为线程安全的。同时展开其他锁,volatile,线程同步,并发等。

volatile:

1.不能保证原子性(用该修饰符修饰某变量,启动1000个线程进行加1操作,结果小于1000)

2.能阻止指令重排(在编译和执行代码时候,处于优化考虑,会重排指令,大多数情况下没问题,但是多线程可能会有问题。用处不多)

3.使用场景:让变量在线程间都可见(变量在线程内存中修改后立即写会主内存,同时其他线程内存中的值失效。用于终止循环的判断,主类设置一个flag为false时线程中的循环一直执行,在别的地方修改类的这个flag时并不会终止线程中的这个循环,只有将该值用volatile修饰,才可以)

比如:ConcurrentHashMap

实现并发的HashMap:

private transient volatile long base Cont;

存储对象的长度的变量是vlatile,这样当有多个线程读写该map对象时候,对长度的修改能让其他线程马上知道。

synchronized:

可作用于代码块,方法,静态方法。

具有可重入特性。(当线程请求由其他线程锁住的方法时,该线程会阻塞。但是当请求自己持有锁的方法时,可以成功,即重入)适用场景:继承。子类父类方法都用synchronized修饰,子类方法调用父类时候,也具有可重入性。同一线程在调用自己类中其他synchronized方法/块或调用父类的synchronized方法/块都不会阻碍该线程的执行,就是说同一线程对同一个对象锁是可重入的,而且同一个线程可以获取同一把锁多次,也就是可以多次重入。 因为java线程是基于“每线程(per-thread)”,而不是基于“每调用(per-invocation)”的(java中线程获得对象锁的操作是以每线程为粒度的,per-invocation互斥体获得对象锁的操作是以每调用作为粒度的)

能锁单个方法,但是不能锁由多个方法组成的业务流程。(比如ATM有登录,查询,存钱,登出等。期望操作是A登录后他人无法登录,直到A登出,为止。但是sync会出现A登录,A·查询(此时登录被释放),B登录,无法锁住流程,用Lock显式锁

同步锁。修饰{}包含的代码块时,多个并发线程到达时,只有一个线程能执行,其余的阻塞状态。

它作用的对象(锁定的对象)是调用这个代码块的实例对象。(当一个类中有一个静态变量,这个静态变量在这个类中的一个方法进行值的修改,该代码块用synchronized修饰,在main函数中调用修改这个变量的方法适合,如果是同一个对象,那么后面调用的就会阻塞,如果是新建了对象,那么二者是同时对这个变量进行修改的)

与此对应的是如果作用于静态方法,那么针对锁的对象是这个类的所有实例对象(因为静态方法不会实例化)

修饰方法和修饰代码块相似,只是范围不同。

synchronized关键字不能继承,子类如果覆盖父类方法,不拥有该特性。

 

synchronized说辞总结:

1.说明Sync作用于方法和静态方法的不同表现

2.可重入锁

3.不太适合业务流程,结合Lock一起使用

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值