java线程和多线程同步
java的线程之间资源共享,所以会出现线程同步问题(即,线程安全)
一、线程创建:
方式①:extends java.lang.Thread,重写run(),run方法里是开启线程后要做的事。.start()启动线程,执行run()里的程序。
方式②:implements java.lang.runnable,实现run(); 然后new Thread(implements产生的线程); 调用.start()启动线程
Thread的方法:
.run() 定义线程要做的事
.start() 启动线程
.sleep()方法使线程进入阻塞状态,当sleep结束后,线程进入就绪状态,继续执行接下来的程序。
.wait() 线程等待
sleep和wait的区别:http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html
.join() :当程序执行过程中调用了其他线程的join()方法时,则当前线程被阻塞,直到执行join()的线程 结束为止。也就是说join方法使一个线程等待另一个线程完成。
.setDaemon(boolean): Daemon守护神。将此线程设置为守护线程。主线程死亡时,守护线程必须死亡,无论是否执行完。当守护线程比主线程执行的快时,可能会比主线程先死。
.interrupt():友好的中断自己
.stop():强制中断线程,不友好
.notify():唤醒线程
.interrupted():可清除线程的中断状态,即,将线程状态改为非中断
.isInterrupted():线程的中断状态不受影响:返回线程的状态:是否中断。不会对线程的现有状态有影响。
二、线程同步(线程安全)
多个线程同时对同一个对象的实例变量进行操作时,会引起同步问题(和操作系统中的进程同步问题是一样的道理,同步问题:数据脏读、不可重复读、丢失更新等)。
解决的方法就是加锁:方法①在java里很简单,给某个方法or某段代码or某个变量加上synchronized关键字,即加锁。
方法②“同步代码块”:给整个方法加锁,那么,进入这个方法的程序都要等待上一个程序释放这个资源,等待的时间太长,效率就低。所以常用的是只给方法中的某段代码加锁。也就是“同步代码块”:写法:synchronized (this) {需要加锁的某段代码}
方法③“同步锁”:java5之后使用ReentrantLock对象和方法加锁。如下:
//方法3:同步锁
public ReentrantLock reentrantLock=new ReentrantLock(); public /*加锁方法1:synchronized*/ void getMoney(String name) {
//加锁方法2:synchronized (this) { reentrantLock.lock();
try {
if (money > 1500) {
money -= 1500;
System.out.println(name + "取款1500成功!");
} else {
System.out.println(name + "余额不足!");
}
} catch (Exception e) {
e.printStackTrace();
} finally{//finally的作用:即使出现异常了,也可以执行解锁的方法unlock()
reentrantLock.unlock();
} //}
}
方法④:对于集合中线程不安全的类,比如ArrayList,Collections类提供了使之可以变得线程安全的方法。如下:
List<String> list=Collections.synchronizedList(new ArrayList<String>());
java线程和多线程同步的更多相关文章
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- Java线程状态及同步锁
线程的生命历程 线程的五大状态 创建状态:简而言之,当创建线程对象的代码出现的时候,此时线程就进入了创建状态.这时候的线程只是行代码而已.只有调用线程的start()方法时,线程的状态才会改变,进入就 ...
- Java线程和多线程(三)——线程安全和同步
线程安全在Java中是一个很重要的课题.Java提供的多线程环境支持使用Java线程.我们都知道多线程共享一些对象实例的话,可能会在读取和更新共享数据的事后产生数据不一致问题. 线程安全 之所以会产生 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java线程中的同步
1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...
- Java 线程与多线程
Java是一门支持多线程的编程语言! 什么是进程? 计算机中内存.处理器.IO等资源操作都要为进程进行服务. 一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也 ...
- Java线程和多线程(十三)——Callable,Future,FutureTask
在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...
- Java线程和多线程(十二)——线程池基础
Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务.开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池. 线程池是Java中多线程的一个重要概 ...
- Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...
随机推荐
- EAS开发环境搭建.
一:EAS开发环境安装 解压EAS服务器安装包到E盘即可,内含BOS开发环境. 二:EAS客户端安装 EAS8.0.exe安装到D盘,这是客户端. 三:远程数据库 使用远程运维系统,登陆数据库.
- CAS集成oauth2协议的支持
参考https://blog.csdn.net/qq_34021712/article/details/82290876, 在springboot体系类,可以采用spring security oau ...
- go微服务框架go-micro深度学习(四) rpc方法调用过程详解
上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地 ...
- 【jquery采坑】Ajax配合form的submit提交(微擎表单提交,ajax验证,submit提交)
1.采坑:实现form的submit提交,在提交之前,进行ajax的不同校验,然后onsubmit=return check(),进行提交 1/1 目的:可以实现以 from的submit提交,然后还 ...
- Windows平台下nginx跨域配置
1)下载地址: http://nginx.org 2)启动 解压至d:\nginx,运行nginx.exe(即nginx -c conf\nginx.conf),默认使用80端口,日志见文件夹D:\n ...
- 开源组件ExcelReport 3.x.x 使用手册(为.netcore而来)
ExcelReport转眼已经开源4年了,期间有很长时间也停止了对它的维护.18年年末有人联系到我,说“兄弟,ExcelReport不错,但什么时候支持.netcore呢?”.我寥寥的回了几句搪塞的话 ...
- ip代理优化
如何保证可用ip不低于2000个,代理ip池优化策略 第一:获得大量ip: 第二:验证可用ip: 第三:监控可用ip: 第三:保证可用ip不低于3000或者5000: 截图是实时可用ip数量 心得:不 ...
- python3 利用正则获取网页中的想保存下来的内容
需要获取某个网页中表格部分中某个产品的成份 分析在html中成份的元素代码 <a href="/composition/4c3060178d1184935a48c4e51be4f63f ...
- LaTeX网址
https://www.latex-project.org/ latex官网 http://www.latexstudio.net/ 国内知名latex学习中心 https://www.ove ...
- Golang进程权限调度包runtime三大函数Gosched、Goexit、GOMAXPROCS
转自:https://www.cnblogs.com/wt645631686/p/9656046.html runtime.Gosched(),用于让出CPU时间片,让出当前goroutine的执行权 ...