【多线程】——synchronized关键字

你的名字 2022-05-23 09:12 368阅读 0赞
  1. synchronizedJava中的关键字,意思为同步,通常在Java中用于多线程的场景下,代表着同步锁。可以修饰方法,变量。简单理解如果使用了在方法上或者在代码块上使用代表,无论哪个线程只要每次调用同一个对象并且运行使用synchronized修饰代码都需要验证有没有正在使用这段代码的线程,如果有则需要等其他线程之后完成后才能继续调用。

什么时候需要使用synchronized?

  1. 如果多个线程同时访问同一个对象中实例变量,则由可能出现“非线程安全”问题。非线程安全问题最经典就是车站卖票,本来只有100张票,结果卖个的人数为100+,此时就是多个线程共享一个实例变量造成的问题。
  2. 为了保证线程的安全,引入synchronized,当多个线程同时操作一个实例变量的时候排序依次进行操作,这样就不会出现多个线程同时操作的情况,线程此时是安全的。

注意:只有涉及到共享资源的读写才需要同步化

synchronized使用方式

1、类锁

synchronized修饰带有static的方法,或者同步代码块中括号中内容为class的时候是类锁,针对该类的所有实例化对象的线程都有作用,排队进行。每个实例化对象直接需要排队进行。

  1. synchronized public static void test() { System.out.println("我是类锁"); }
  2. public void classLock() { synchronized (LockClass.class) { System.out.println("我是类锁"); } }

2、对象锁

synchronized修饰普通方法或者变量都是对象锁,仅针对使用该对象的线程需要排队。

  1. synchronized public void objectFunctionLock() { System.out.println("我是普通方法对象锁"); } private Object object = new Object(); public void objectVariableLock() { synchronized (object) { System.out.println("我是变量对象锁"); } }

3、同步不具有继承性

4、支持可重入锁

  1. 当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁,就是一个线程中多个锁方法连续调用,依旧可以获得锁,即为可重入锁。可重入锁支持父子继承关系中。

5、同步代码块

  1. 当一个方法中有同步代码块,此方法支持一部分异步,加锁的一部分同步,这样可以缓解一部分因为同步锁造成的运行时间缓慢的问题,只在需要的地方才加同步代码块。

6、synchronized(this)和synchronized(非this)

  1. 这一部分看到很多人都在纠结,其实很简单括号中放的是什么对象就锁住什么对象,this就是当前对象本身,非this就是自身以外的其他内容,可能就是成员变量之类的内容。只要成员变量指向的位置不发生变化,里面的属性随便变,都不影响当前对象当做锁来使用。

总结

  1. 好好的去理解,去实践,远比想象中的简单很多!

发表评论

表情:
评论列表 (有 0 条评论,368人围观)

还没有评论,来说两句吧...

相关阅读