Java多线程基础(synchronized同步方法详解)

例子

无法执行两个无限循环,按照程序执行的顺序,必然会一直执行第一个无限循环体而无法执行第二个循环体。

若通过两个线程来执行循环体AB,线程A和B会轮流获得CPU处理,两个循环体都可以执行啦!可以说通过线程,两个死循环变成了一个,把CPU卡住了。

线程基础

创建和运行

用Thread类创建线程对象,需要重写Thread类的run()方法,run方法中规定线程所要作的操作。

 //继承Thread类
public class B extends Thread{

    public void run() {
        ......
    }
    
}
//main函数
public static void main(String args[]) {
    A thread = new Thread();//创建线程
    thread.start();//启动线程,会自动调用run()方法
}

使用Thread类直接创建线程对象,第一个参数是实现Runnable接口类的实例。优点是便于多个线程的变量共享

public A protask implements Runnable{

    @Override
    public void run() {
        ......
    }
    
}

//main函数
public static void main(String args[]) {
    A target = new A();
    Thread thread = new Thread(A);//
    thread.start();//启动线程,会自动调用run()方法
}

线程同步

例子程序语言
出纳和会计共用同一账户线程SaveA,TakeB共享同一变量
取钱和存钱的操作不能同时进行不允许多个线程同时修改同一变量
取钱时不允许存钱允许TakeB线程取钱操作,禁止SaveA线程存钱操作
存钱时不允许取钱允许SaveA线程存钱操作,禁止TakeB线程取钱操作

要实现存取的互斥,需要使用synchronized关键字修饰函数方法。当线程A使用了synchronized(同步)方法时,线程B想要执行同步方法,必须等待A执行完该方法。

public class account implements Runnable{
    int amount;//共享变量
    @Override
    public void run() {
    saveOrtake();//同步方法
    }
}

public synchronized void saveOrtake(){
    if(Thread.currentThread().getName().equals(SaveA)){
        //存钱
    }
    else{
        //取钱
    }
}

协调同步的线程

当一个线程使用同步方法中用到的某一个变量,而此变量需要其他线程修改之后才能符合线程的需要时,参考下面的例子:

例子程序语言
出纳想取钱但发现账户金额<=0时,出纳不能取钱,等待会计存钱TakeB线程等待,将CPU使用权让出,SaveA线程继续执行
经会计存钱,账户金额>0,出纳继续取钱唤醒TakeB线程执行取钱操作
public class account implements Runnable{
    int amount;//共享变量
    @Override
    public void run() {
    saveOrtake();//同步方法
    }
}

public synchronized void saveOrtake(){
    if(Thread.currentThread().getName().equals(SaveA)){
        //存钱
        if(amount>0)notifyAll();//唤醒所有进程
    }
    else{
        if(amount <=0) wait();//线程等待,直到金额大于0后将其唤醒,执行取钱操作
        //取钱
    }
}

注意:notify(), notifyAll(), wait()只能在同步方法中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以简单解释一下多线程synchronized的含义。synchronizedJava 语言中的一个关键字,它修饰的代码块,表示当前线程独占对象,其他线程无法对这段代码进行访问,也就是只有一个线程可以执行这段代码,其他线程只能等待。这样做的目的是为了保证共享资源的完整性和一致性。 ### 回答2: 多线程synchronized是一种用于实现线程安全的技术。在多线程编程中,当多个线程同时访问共享资源时,可能会出现数据不一致或产生竞态条件等问题。为了解决这些问题,可以使用synchronized关键字对关键代码块或方法进行同步synchronized关键字可以用于修饰代码块或方法。当修饰代码块时,需要指定对象作为锁,即synchronized(obj){},这样只有获取到锁的线程才能执行代码块内的内容,其他线程需要等待。而当修饰方法时,表示整个方法同步的,相当于synchronized(this){}。 通过synchronized关键字,可以保证在同一时间只有一个线程可以执行被锁定的代码块或方法,从而避免了并发访问共享资源时的冲突。当一个线程执行完synchronized代码块或方法后,会释放锁,其他线程才能获取到锁并执行相应的代码。 synchronized还具有可重入性,即一个线程在获取到锁后,可以再次获取到该锁,而不会造成死锁。这是因为synchronized是基于持有锁的机制,当线程再次进入被synchronized修饰的代码块或方法时,会判断当前线程是否已经持有锁,如果是则可以继续执行,否则需要等待获取锁。 然而,synchronized也存在一些限制和局限性。首先,synchronized只能保证同一时间只能有一个线程执行被锁定的代码块或方法,不能满足多个线程同时访问的需求。其次,如果一个线程获取到锁后进入了死循环或长时间的阻塞操作,会导致其他线程一直等待无法获得锁,从而造成线程的饥饿问题。 总的来说,多线程synchronized是一种常用的线程同步技术,通过保证同一时间只有一个线程访问共享资源,从而避免了数据不一致和竞态条件等问题。然而,在使用synchronized时需要注意避免死锁和饥饿问题的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值