java锁的面试题

另外的的线程完全可以访问没有锁定的方法,例如在一个线程中将某个方法锁定,但是我们仍可以通过

其他的线程,得到该线程中“变量的改变之后的值”。


import java.io.*;
import java.lang.*;
import java.util.*;
public class hehe implements Runnable{
	public int b = 100;
	public synchronized void m1()throws Exception{
		b = 1000;
		Thread.sleep(2000);
		System.out.println(b);
	}
	public void m2(){
		System.out.println(b);
	}
	public void run(){
		try{
			m1();
		}catch(Exception e){
			return ;
		}
	}
	public static void main(String[] args)throws Exception{
		hehe t = new hehe();
		Thread rr = new Thread(t);
		rr.start();
		
		Thread.sleep(2000);
		t.m2();
	}
}



### Java 机制面试题解析 #### Lock 和 synchronized 的区别 Lock 接口提供了比内置更广泛的定操作,灵活性更高。然而,使用 `Lock` 时必须显式地获取和释放,并且应当始终在 `finally` 块中释放[^2]。相比之下,`synchronized` 是一种内置的关键字,在进入同步代码块之前自动获取对象监视器,在退出时自动释放该监视器。 #### 可重入的概念 可重入意味着线程可以多次获取同一个而不被阻塞。无论是通过 `ReentrantLock` 还是 `synchronized` 实现的都支持这一特性。这意味着如果某个线程已经持有了某把,则它可以再次请求同一把而不会发生死的情况。 #### 死预防策略 为了避免死的发生,通常建议采用以下几种方式之一: - 尽量减少持有的时间; - 使用超时参数来尝试获取; - 对多个资源加时按照固定的顺序进行; #### 公平性和非公平性 对于某些类型的来说,比如 ReentrantLock, 存在一个选项可以选择是否启用公平模式。当设置为公平模式时,等待最久的那个线程会被优先分配到;而非公平模式下则允许插队行为存在,即新到来的线程有机会立即获得即使有其他线程已经在排队等候。 ```java // 创建一个公平实例 final ReentrantLock fairLock = new ReentrantLock(true); ``` #### 自旋的应用场景 自旋适用于竞争不激烈而且持有时间非常短的情况下。因为在这种情况下,让线程一直循环检查能否拿到的成本要比挂起再唤醒低得多。Java 中可以通过 `LockSupport.park()` 方法配合条件变量实现简单的自旋逻辑。 ```java import java.util.concurrent.locks.LockSupport; public class SpinWait { private volatile boolean ready = false; public void waitForReady() { while (!ready) { LockSupport.park(); } } public void setReady(boolean value){ this.ready=value; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值