java多线程编程核心技术前夜2(synchroized)

本文深入探讨Java中线程同步的关键概念和技术,包括synchronized关键字的作用原理、可重入锁的概念、脏读现象及避免方法,同时解析volatile关键字如何确保变量的可见性等问题。

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

1.声明一个线程对象thread1,thread1中有一个没有添加synchroized关键字的方法,Thread threadA=new Thread(thread1);Thread threadB=new Thread(thrad1);threadA.start();threadB.start();这是就会产生两个线程同时访问一个非同步方法,造成执行顺序不同步。

2.synchroized关键字获得的锁是对象的锁,而不是获得对一个方法或一段代码的锁,如果创建两个相同的对象,对象类中有一个方法,声明为synchroized,创建两个线程分别访问这两个对象,则这两条线程是异步(asynchroized)执行的,因为两条线程分别获得了两个对象各自的锁。如果对象类中的所有方法都加上了关键字synchroized,则两条线程访问对同一个对象中的不同方法也是同步进行的。即一条线程访问一个对象中的synchroized方法,此时它获得这个对象的锁,另外一条线程访问这个对象中的其他带synchroized关键字的方法,则这条线程需要等待获得对象锁。

3.脏读:多个线程对同一个变量进行读取的时候,由于异步执行,读取到的数据不是准确的数据,是一个被修改过的数据。

4.可重入锁:一条线程获得了一个对象的锁,这时这个对象的锁还没有被释放,如果还想再次获得这个对象的锁是可行的,这就叫可重入锁,不然就会造成死锁。可重用锁可以用在继承的环境中。即线程在子类对象中可以调用父类对象的synchroized方法。

5.如果一条线程执行出现异常,那么会释放它获得的锁。

6.同步是不存在于继承的,必须在子类中重新声明synchroized。

7.同步代码块:synchroized(this){.....};在同步代码块中的代码在执行时同步。

8.synchroized(this)和synchroized方法一样是获得当前对象的锁。

9.如将synchorized修饰static方法,则锁定的是.java文件对应的那个class类。而class锁可以对所有的类对象起作用。synchroized static方法和锁定synchroized(a.class)作用是一样的。

10.内部类和静态内部类的声明方式:外部类PublicClass。PublicClass publiccalss=new PublicClass();声明内部类PrivateClass privateclass=publicclass.new PrivateClass();声明静态内部类就和声明普通对象一样:PrivateClass privateclass=new PrivateClass();

11.volatile关键字:cpu执行命令的时候,是将内存中的数据拷贝一份到高速缓存(这里是线程数据栈)中,从高速缓存中读取命令执行。一个声明了volatile的变量,在高速缓存中被cpu读取修改,这时这个变量就能立即写回主存中。但是写回主存需要时间的,其他处理器中缓存的这个变量的值还是旧的,这是cpu就会通过嗅探在总线中传输的数据来判断这个值是否是旧的,如果cpu发现自己高速缓存中此变量的内存地址被修改,则将本地变量标记为无效,从主存中重新获取这个变量的值。此关键字能保证变量的可见性,但不能保证变量的原子性。

12.synchroizedd关键具有可见性和互斥性。可见性:一个线程 更改 了线程工作内存中的变量会立马写入到主内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值