1 谈谈你对volatile的理解和认识?
1 volatile 是java虚拟机提供的轻量级的同步机制
1.1 保证可见性
1.2 不保证原子性
1.3禁止指令重排
2 JMM你谈谈
JVM(java虚拟机)
JMM(java内存模型)
JMM本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范
定义了程序员中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式
JMM关于同步的规定:
1 线程解锁前,必须把共享变量的值刷新回主内存
2 线程加锁前,必须读取主内存的最新之到自己的工作内存
3 加锁解锁是同一把锁
3 你在哪些地方用到过volatile
4 我们知道ArrayList是线程不安全的,请编写一个安全的案例并给出解决方案
5 HashSet底层是HashMap吗?
6 对于锁的理解
package offer10.阻塞队列;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
class MyResource{
private volatile boolean FLAG = true;//默认开启进行生产和消费
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue<String> blockingQueue = null;
//传接口不要传类,这样凡是实现了这个接口的类都可以传进来!编程思想
public MyResource(BlockingQueue<String> blockingQueue){
this.blockingQueue=blockingQueue;
//看看你获取到的是哪个
System.out.println(blockingQueue.getClass().getName());
}
public void myProd() throws Exception{
String data =null;
boolean result;
while (FLAG){//如果true开始生产
data = atomicInteger.incrementAndGet()+"";
//如果超过限时2秒不再生产
result = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);
if(result){
System.out.println(Thread.currentThread().getName()+"生产蛋糕队列"+data+"成功");
}else {
System.out.println(Thread.currentThread().getName()+"生产蛋糕队列"+data+"失败");
}
TimeUnit.SECONDS.sleep(1);//每生产一个停一秒,这样效果比较明显,可以不加
}
System.out.println(Thread.currentThread().getName()+"老板关店停止生产");
}
public void myConsumer() throws Exception{
String result = null;
while (FLAG){
//同样,超过2秒就不买蛋糕了
result = blockingQueue.poll(2L, TimeUnit.SECONDS);//因为放进去的是1,2...取出来也是1,2...
if(result==null||result.equalsIgnoreCase("")){
FLAG =false;
System.out.println(Thread.currentThread().getName()+"超过2秒没有拿到蛋糕,消费退出");
return;
}
System.out.println(Thread.currentThread().getName()+"消费蛋糕队列"+result+"成功");
}
}
public void stop() throws Exception{
this.FLAG =false;
}
}
public class ProdConsumer_BlockQueueDemo {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue<>(3));
new Thread(()->{
System.out.println("生产蛋糕线程启动");
try {
myResource.myProd();
} catch (Exception e) {
e.printStackTrace();
}
},"prod").start();
new Thread(()->{
System.out.println("消费蛋糕线程启动");
try {
myResource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
},"consumer").start();
//给你们5秒钟的时间生产和消费蛋糕,五秒后关店
try {
TimeUnit.SECONDS.sleep(5);
myResource.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}