转载

你理解的 synchronized 可能不对

synchronized对于使用java开发的人来说一定不陌生,同步是多线程很重要一个概念,因为比如对于共享数据可能需要多个线程操作,而共享数据对象本身又不支持多线程,这时就需要多线程操作。

你理解的 synchronized 可能不对

多线程同步用synchronized,这个是没有任何问题,但是synchronized作用在不同的地方,配合不同方式会产生不同效果,一个是作用在方法上,比如 public  void synchronized read() ,在有就是作用在方法体内 synchronized(this) {}这两种形式,作用在方法上表示方法为同步,作用在方法体上,表示方法体内同步。

用synchronized时会遇到一个问题,就是想同步地方没有管理住,发现synchronized不管用,其实真实情况不是不管用而是没用对。需要从java涉及几个概念说起,一是类、一个是对象、一个是线程。

类是我们实际开发中主要编写的东西,类编译后生成Class文件,他在虚拟机执行并且只有一个。

对象是类的一个实例,一个类可以有很多实例,也就是很多对象。特殊类只有一个对象就是单例类。

线程是运行中的程序,整个对象运行态构成线程。

synchronized 在非静态方法上以及synchronized(this)是锁住对象,兑现在多个线程只有一个是可以锁住的。多个线程有多个就锁不住。

要想锁住多个线程中多个对象采用,static synchronized或者synchronized(A.class),锁住直接是基于类代码段,将来只会有一个线程进入这个代码段。这种锁级别是类级别,是最大的,对于性能影响也是最大的,需要根据实际情况去用,要尽量少用。

在实际情况中能用对象锁,尽量用对象锁,多个线程共享对象,这样性能是更高的。多线程锁应用本身需要对对象、类、线程理解清晰,根据实际业务场景去用对象锁还是类锁。尽量不要在锁中应用rpc,这样会导致整个服务性能受到极大影响。

原文  https://mp.weixin.qq.com/s/8NoeV7vu0bOQ6Bz4X_jLlQ
正文到此结束
Loading...