Java线程同步之synchronize

本文深入探讨Java多线程并发控制中出现的问题,重点讲解synchronized关键字的使用,包括非static方法同步、代码块同步和static方法同步,以及它们如何确保数据的准确性和线程间的互斥。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、java多线程产生的问题:

Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突。

因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。两种锁分别是:synchronized和ReentrantLock

二、synchronized关键字

Synchronzied实现同步的表现形式分为:代码块同步和方法同步。

1、非static方法同步

public synchronized void method1(){}

锁住的是该对象,类的其中一个实例,当该对象(仅仅是这一个对象)在不同线程中执行这个同步方法时,线程之间会形成互斥,达到同步效果。
但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁。

2、代码块同步

synchronized(this){ //TODO }

描述同1

3、static方法同步

锁住的是该类,当所有该类的对象(多个对象)在不同线程中调用这个static同步方法时,线程之间会形成互斥,达到同步效果。

4、代码块同步

synchronized(Test.class){ //TODO}

描述同3

5、总结:

<1> 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

<2> 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

<3> 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

<4> 当两个并发线程访问synchronized修饰不同或相同静态方法时,那么一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完后才能执行。

<5> 当一个线程访问一个synchronized修饰静态方法,另一个访问synchronized修饰非静态方法时,那么不同的线程依然可以同时访问,这是因为类锁和对象锁是两个不一样的锁,控制着不同的区域,它们是互不干扰的

<6> 当一个线程访问一个synchronized修饰静态方法,另一个访问非synchronized修饰的方法时,那么不同的线程依然可以同时访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值