001--java高并发初步
来源:互联网 发布:java基础讲解实战 编辑:程序博客网 时间:2024/05/20 18:03
一般说的java高并发,基本是讲3个方面的
01,同步,包括synchronized 和各种锁02,同步容器,比如ConcurrentHashMap等03,线程池
01,synchronized跟ReentrantLock的区别
01,发生异常时,前者会释放锁,而后者不会02,ReentrantLock可以进行尝试锁定,如果一段时间内锁定失败了,就可以执行其他操作,而不必一直等待,在灵活性上,要比synchronized要好。03,在性能上,一般的说法是,当并发度不高的时候,性能区别是不大的。04,在线程打断机制上面,重入锁更好用05,两种锁默认都不是公平锁,ReentrantLock可以是设置为公平锁。06,ReentrantLock锁的Condition可以做到对线程唤醒的精确控制
02,通过一个例子学习重入锁的打断机制
final ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { lock.lockInterruptibly();// System.out.println("t1正在执行"); TimeUnit.SECONDS.sleep(5); System.out.println("t1执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); }finally { if(lock.isLocked()){ lock.unlock(); System.out.println("刚刚释放了t1的锁"); }else { System.out.println("t1的锁已经被释放了"); } } } }); t1.start(); TimeUnit.SECONDS.sleep(2); Thread t2 = new Thread(new Runnable() { @Override public void run() { lock.lock(); try { System.out.println("t2执行了"); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } }); t2.start(); TimeUnit.SECONDS.sleep(1); t1.interrupt(); }
从上面的例子可以看出,使用重入锁的线程,是可以被打段的。前提是用锁的可打算方法去锁。比如一个线程老是占用资源不撒手,其他线程可以主动打断它,但是,打断后,也要进行锁的释放,否则其他线程还是拿不到锁。
03,现在面试问生产者,消费者的情况非常多,下面给出一个生产者消费者小例子,注意,90%以上的情况,wait需要跟while配对。
这里写
04,举一个非线程安全的例子
final List<Integer> list = new ArrayList<>(); Thread[] threads = new Thread[100]; CountDownLatch countDownLatch = new CountDownLatch(threads.length); for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { list.add(24); } } }); } for (int i = 0; i < threads.length; i++) { threads[i].start(); countDownLatch.countDown(); } countDownLatch.await(); System.out.println(list.size());
阅读全文
0 0
- 001--java高并发初步
- 高并发处理-初步了解(一)
- 初步探索Nginx高并发原理
- 初步探索Nginx高并发原理
- 并发 - java高并发解决方案
- java-并发-高并发概述
- java高并发、高性能
- java高并发解决方案
- java高并发解决方案
- java 高并发 基础知识
- java高并发解决方案
- java高并发解决方案
- java高并发解决方案
- java高并发解决方案
- java高并发解决方案
- java高并发处理
- java高并发解决方案
- java高并发解决方案
- web Service的服务端和客户端
- 51nod 1611 金牌赛事&&cf115E [线段树]
- Demo总结
- Spring -AOP -java静态代理和动态代理实例
- 深入浅出 RPC
- 001--java高并发初步
- 1061 杨辉三角 C++ Visual C++
- 设计六大原则之接口隔离原则
- 将军令 (贪心)
- 10.24 环境变量PATH,cp,mv,文档查看cat/more/less/head/tail
- SPI协议及工作原理
- opencv数字识别
- 学生信息录入
- C语言