超级实习生计划学习打卡第五天——Java 多线程

本文探讨了Java中的线程同步机制,通过`synchronized`关键字实现方法的互斥访问。示例展示了两个线程A和B对同一对象的`synchronized`方法的调用,执行顺序依赖于CPU调度。同时,介绍了线程休眠如何影响执行顺序,即使加上休眠,线程执行的先后仍然不确定。此外,还讨论了非`synchronized`方法在多线程环境中的行为。
摘要由CSDN通过智能技术生成

1.标准访问

class Phone{
    public synchronized void sendEmail() throws Exception {
        System.out.println("**sendEmail");
    }
    public synchronized void sendSMS() throws Exception {
        System.out.println("**sendSMS");
    }
}
public class Lock8Demo {
    public static void main(String[] args) throws InterruptedException {
        Phone phone=new Phone();
        new Thread(()->{
            try{
                phone.sendEmail();
            }catch (Exception e){
                e.printStackTrace();
            }
        },"A").start();
        new Thread(()->{
            try{
                phone.sendSMS();
            }catch (Exception e){
                e.printStackTrace();
            }
        },"B").start();
    }
}

两个方法均使用synchronized关键字修饰,A、B两线程互斥。线程的执行顺序,是根据cpu的分配情况,而不是根据代码的先后次序,因此打印结果是1,2或者2,1不确定。

2.线程休眠

对sendEmail()方法进行如下修改:

public synchronized void sendEmail() throws Exception {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("**sendEmail");
    }

一个对象只有一把锁,当一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,所以无法访问该对象的其他synchronized实例方法。(先到先得)

A、B线程执行的先后顺序依然是不确定的,因此打印结果是1,2或者2,1不确定。

3.新增普通方法
在Phone类中新增普通“sayHellow”方法:
 

public void sayHellow() throws Exception {
        System.out.println("**sayHellow");
    }

修改线程B中调用的方法

phone.sayHellow();
//phone.sendSMS();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值