synchronized使用

本文深入探讨了Java中线程同步的各种机制,包括synchronized关键字的使用方式及其内部原理,ReentrantLock类的特性与应用,以及Java线程间的通信机制。通过具体的代码示例,读者可以了解到如何有效地管理线程间共享资源的状态。

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

一、同步多线程

同步多线程是一种在一个CPU的时钟周期内能够执行来自多个线程的指令的硬件多线程技术。

线程同步控制:对多个线程共享的资源(的)状态进行的统一性控制。

二、关键字synchronized(同步)

同步的本质:

当线程调用时,资源(对象)会加锁的,当用完资源后,锁在打开。意味着同一时刻,只有一个线程可以使用方法。

synchronized块

private Object lock1 = new Object(); //成员变量的锁

private Object lock2 = new Object(); //成员变量的锁

public int getMoney1(){

//多个方法用同一把锁,多个方法一起排队

        synchronized(lock1){ }

}

public int getMoney2(){

//多个方法用同不同锁,各个方法单独排队

        synchronized(lock2 ){ }

}

synchronized不仅可以修饰方法,也可以修饰块。这两者的区别:

修饰方法是给对象(Class)加锁,如果有两个方法同步,则不能同时执行;

修饰块是给方法加锁,指同一个方法间的排队。

修饰方法时,只能用一个方法运行(排队)

如果两个方法用一把锁,那么两个方法只能一个进行;

如果两个方法不用同一把锁,那么两个方法互不影响,都可进行。

注:小面试题

private static Object lock1 = new Object();

//成员变量的锁

public synchronized static void abc(){

        //这个锁的为.class的类文件

}

public synchronized void abc(){

        //这个锁的是new的类对象

}

三、ReentrantLock类

一个可重用的互斥锁,实现Lock接口。Lock接口实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。(可以取代synchroized关键字)

Lock的方法 lock(); //使用锁 unLock(); //解锁

代码举例:

private final ReentrantLock lock = new ReentrantLock();

//方法

public int getMethod(){

this.lock.lock();

//上锁

        try{

                //业务代码

        }finally{

                //解锁

                this.lock.unlock();

        }

}

四、java线程通信

基本概念:对被多个线程共享(共同使用、共同操作)的资源(对象),(由资源本身(这个对象))分配线程之间操作的调节与控制。

共享资源对象的方法:(注:不是线程的方法,是Object的方法)

1.wait(); //调用此对象的方法,使线程等待

2.notify(); //调用此对象的方法,唤醒一个线程

2.notifyAll(); //调用此对象的方法,唤醒所有线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值