JAVA -线程四(未完)
早上主要学习了Synchronized以及公平锁和非公平锁
1、所谓的Synchronized真正的含义叫做同步。同步的内容是一个对象,表示同一时刻,只会有一个线程对目标对象进行操作,而其他线程在执行前,会查看是不是有其他线程已经同步这个对象
2、 synchronize除了底层的同步对象以外,它实现在应用层面的时候,像极了排它锁,所以我们叫他锁真正意义上的java里面被叫做lock的东西,是有独立体系的。
线程的代码实现:
main:
public class Main {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();MyThread first = new MyThread(lock);SecondThread second = new SecondThread(lock);first.start();second.start();System.out.println(lock.getQueueLength());System.out.println(lock.hasQueuedThreads());
}
}
MyThread:
package com.ma1;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class MyThread extends Thread {// Object mutex;
//
// public MyThread(Object mutea) {// this.mutex = mutex;
// }ReentrantLock lock;public MyThread(ReentrantLock lock) {this.lock = lock;}@Overridepublic void run() {// synchronized (mutex) {//
// }// lock.lock();
// for(int i = 0;i<100 ;i++) {// System.out.println(this.getName() + " : " + i);
// }try {lock.lock();
// if (lock.tryLock(1000, TimeUnit.MILLISECONDS)) {//
// } else {// System.out.println("锁失败");
// }Thread.sleep(1000);for (int i = 0; i < 100; i++) {System.out.println(this.getName() + " : " + i);}System.out.println("hold count : " + lock.getHoldCount());} catch (InterruptedException e) {e.printStackTrace();} finally {// if (lock.isHeldByCurrentThread() && lock.isLocked()) {// c
// }lock.unlock();}System.out.println("hold count : " + lock.getHoldCount());}}
SecondThread:
package com.ma1;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class SecondThread extends Thread {ReentrantLock lock;public SecondThread(ReentrantLock lock) {this.lock = lock;}@Overridepublic void run() {// lock.lock();
// for(int i = 0;i<100 ;i++) {// System.out.println(this.getName() + " : " + i);
// }
// lock.unlock();看看能否被锁住,返回一个布尔值try {// if(lock.tryLock(1000, TimeUnit.MILLISECONDS)) {//如果等待1000毫秒没有锁上的话,那么就解锁
// for(int i = 0; i<100; i++) {// System.out.println(this.getName() + " : " + i);
// }
// //lock.unlock();
// } else {// System.out.println("锁失败了");
// }lock.lock();Thread.sleep(1000);for (int i = 0; i < 100; i++) {System.out.println(this.getName() + " : " + i);}System.out.println("Second : " + lock.getHoldCount());//看看被锁了几次} catch (Exception e) {e.printStackTrace();} finally {if (lock.isHeldByCurrentThread() && lock.isLocked()) {lock.unlock();}}}
}
对比synchronize和ReentrantLock
二者都是可重入锁。都可以实现线程之间的同步过程
1、synchronize依赖底层对象的字节码实现,也就是说,其锁状态是加载了对象的字节码上了而ReentrantLock是依赖LockUtil.park();方法来实现加锁的过程。这个过程还用到了AQS所以其上层代码较多。只有在最后的阻塞过程,才使用了底层(C++)的部分实现
2、synchronize是可以在结束的时候许,主动释放掉资源的,但是Lock不行,必须手动调用unlock方法来释放资源
3、synchronize是可以手动在执行的过程中,通过wait方法短暂释放资源的,但是lock不行(因为lock底层没有对象的)
一些练习题:
JAVA -线程四(未完)相关推荐
- java线程四种状态
一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...
- Java线程问题 看完这篇就够了
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.进程是什么? 二.线程是什么? 三.线程和进程区别是什么? 四.串行,并行,并发的区别 五.线程实现的几种方法 1.继承 ...
- 简述java 线程四个状态_面四个选项中,哪些是线程进入阻塞状态的原因?_学小易找答案...
[简答题]通过继承 Thread 类的方式创建两个线程,在 Thread 构造方法中指定线程的名字,并将这两个线程的名字打印出来. [论述题]请运用所学原理解释,为什么在孩子成长的过程中,家长要不断地 ...
- linux安装java学习环境(未完待续)
linux安装java学习环境 数据库连接命令 连接mysql数据库 格式为: mysql -hip地址 -p端口号 -u root -p 输入密码例如: mysql -hlocalhost -p33 ...
- Java并发笔记-未完待续待详解
为什么需要并行?– 业务要求– 性能并行计算还出于业务模型的需要– 并不是为了提高系统性能,而是确实在业务上需要多个执行单元.– 比如HTTP服务器,为每一个Socket连接新建一个处理线程– 让不同 ...
- 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
问题描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路1: ...
- Java线程专栏文章汇总(转)
原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程 Java线程(一):线程安全与不安全 Java线程 ...
- 面试题:四种Java线程池用法解析 !=!=未看
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() { @Override ...
- 图解 Java 线程的生命周期,看完再也不怕面试官问了
文章首发自个人微信公众号: 小哈学Java www.exception.site/java-concur- 在 Java 初中级面试中,关于线程的生命周期可以说是常客了.本文就针对这个问题,通过图文并 ...
最新文章
- 洛谷P3572 [POI2014]PTA-Little Bird
- BCH再迎升级,真正比特币即将归来!
- 期末考试中微积分的证明题的分析:Taylor级数展开
- python selenium 三种等待方式详解
- 自然语言处理(四)统计机器翻译SMT
- SQL Server 性能调优(方法论)
- $Android连续按返回键两次实现退出程序
- 台式电脑键盘字母乱了_键盘侠的育儿经利用键盘引导学龄前儿童正确使用电脑、学习英文字母和拼音...
- 80-20-075-原理-Flink内存管理
- 嵌入式开发的职业前景分析
- 【C】输出乘法口诀表
- AcheGesture 简介(使用方法 / 中文教程)
- banner图/轮播图----html
- java写的exe程序反编译_【Jad】利用jdk自带的jad.exe实现批量反编译class文件
- Python第三方模块的下载与安装
- PyTorch1.13 亮点一览,TorchEval、MultiPy 、TorchSnapshot 新库大解读
- win10cmd重置系统_win10命令提示符一键还原修复系统
- 河南增值税开票系统原服务器地址,河南省增值税发票综合服务平台登录入口:https://fpdk.henan.chinatax.gov.cn...
- 51单片机流水灯三种实现方法
- 汽车行业如何玩转“Web3.0”?智己汽车“原石谷”开启区块链应用新场景!