java线程同步例子_JAVA线程同步实例教程
线程是Java程序设计里非常重要的概念,本文就以实例形式对此加以详细解读。具体分析如下:
首先,线程加锁有什么用处呢?举个例子:比如你现在有30000块大洋在银行存着,现在你到银行取钱,当你输入密码完成后,已经输入取款金额,比如你输入的是20000,就是在银行给你拿钱这个时刻,你老婆也去银行取这笔钱,你老婆同样取20000,因为此时你的账上仍然是30000,所以银行同样的操作在你老婆那端又进行了一遍,这样当你们两个完成各自操作后,银行记录的你账上还应该有10000块存款,这样是不是很爽。解决这个问题就用到了线程加锁的知识,下面就让我们一起来学习一下吧。
一、未处理线程同步的一个例子:
public class TextSync implements Runnable{
/**未处理线程同步
* @param args
*/
Time time = new Time();
public static void main(String[] args) {
TextSync text = new TextSync();
Thread t1 = new Thread(text);
Thread t2 = new Thread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
time.add(Thread.currentThread().getName());
}
}
class Time {
private static int num = 0;
public void add(String name){
try {
num++;
//当第一个线程执行到此时,num变成了1,第一个线程暂停一秒,
//第二个线程开始执行,当第二个线程执行到此时,num变成了2,第二个线程暂停一秒,
//第一个线程此时的num同样变成了2,所以最终的结果均为2;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"是第"+num+"个执行的线程。");
}
}
输出结果:
t2是第2个执行的线程。
t1是第2个执行的线程。
二、线程同步
public class TextSynctwo implements Runnable{
/**线程同步
* @param args
*/
Time1 time = new Time1();
public static void main(String[] args) {
TextSynctwo text = new TextSynctwo();
Thread t1 = new Thread(text);
Thread t2 = new Thread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
time.add(Thread.currentThread().getName());
}
}
class Time1 {
private static int num = 0;
//synchronized锁定当前线程,可以在方法定义时进行声明,或采用在方法中进行设置。
public synchronized void add(String name){
//synchronized (this) {//锁定当前线程,防止此时被别的线程执行
try {
num++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"是第"+num+"个执行的线程。");
//}
}
}
输出结果:
t1是第1个执行的线程。
t2是第2个执行的线程。
三、死锁
public class TestDeadLock implements Runnable{
/**死锁
* @param args
*/
private int flag = 0 ;
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 2;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
if(flag == 1){
synchronized(o1){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag == 2){
synchronized(o2){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1){
System.out.println("2");
}
}
}
}
}
四、锁定
public class TT implements Runnable{
/**锁定
* @param args
*/
int b = 100;
public static void main(String[] args) {
TT tt = new TT();
Thread th = new Thread(tt);
th.start();
try {
tt.m2();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(tt.b);
}
@Override
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
private synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
private synchronized void m2() throws Exception{
Thread.sleep(2500);
b = 2500;
}
}
现在的输出结果是:
1000
b=1000
可见这里m2先执行,m1要等m2执行完毕后方可执行。
希望本文所述对大家的Java程序设计有所帮助
java线程同步例子_JAVA线程同步实例教程相关推荐
- java 策略模式例子_java策略模式实例解析
1.策略模式概述: 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并让它们可以相互替换.策略模式让算法独立于使用它的客户而变化,也称为政策模式.策略模式是一种行为型 ...
- java线程安全例子_Java总结篇系列:Java多线程(三)
本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...
- java 线程 状态 图_Java线程中的生命周期和状态控制图文详解
这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...
- java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- java线程详解_Java线程详解
程序.进程.线程的概念程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.动 ...
- java线程池功能_Java线程池总结
一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...
- java 线程组作用_Java线程组(ThreadGroup)使用
JDK 对线程组类注释: A thread group represents a set of threads. In addition, a thread group can also includ ...
- java线程池执行器_Java线程池ThreadPoolExecutor的使用
Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...
- java executor 源码_Java线程池ThreadPoolExecutor深度探索及源码解析
我们的程序里,时常要使用多线程.因此多线程的管理变的尤为重要.ThreadPoolExecutor很好的解决了这一点.本篇文章主要从源码入手,分析ThreadPoolExecutor的原理. 1.标记 ...
最新文章
- 指定模块打包命令_大前端进阶之Babel、模块化、webpack
- 中国已经过了做手机操作系统的窗口期
- java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
- MIUI V5正式发布 全部功能展示PPT回看
- iPhone11因便宜销量超预期;三星手机曝高危漏洞;xUtils 3.8.3发布 | 极客头条
- maven 本地仓库添加jar包
- 异地多活,企业上云的必然趋势!
- Linux 配置rdate时间服务器方法
- 吉林大学超星MOOC高级语言程序设计 实验06 (2021级)
- pg(高斯)(postgreSQL)数据库修改字段长度
- Python学习视频教程大全
- php1蛋白质带电情况,拿到一个蛋白以后,首先需要对蛋白进行全面的了解,所谓知彼知己方能百战不殆:...
- 多边形的定义为什么要强调封闭图形_11.3.1 多边形讲解.ppt
- Java 在Word中创建多级项目符号列表和编号列表
- icloud验证失败连接服务器时出现问题,登录 iCloud 提示验证失败连接到服务器时出现问题怎么办及苹果iPhone手机安装两个微信教程...
- 计算机软件ae常用英语,AE英文插件该怎么翻译?
- RV1126RV1109 buildroot 增加GPIO测试程序
- SRS4.0源码分析-序言
- 2022年,中国餐饮数字化进行到哪一步了?
- layui table 复选框跳页后再回来保持原来选中的状态