线程是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线程同步实例教程相关推荐

  1. java 策略模式例子_java策略模式实例解析

    1.策略模式概述: 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并让它们可以相互替换.策略模式让算法独立于使用它的客户而变化,也称为政策模式.策略模式是一种行为型 ...

  2. java线程安全例子_Java总结篇系列:Java多线程(三)

    本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...

  3. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  4. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  5. java线程详解_Java线程详解

    程序.进程.线程的概念程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.动 ...

  6. java线程池功能_Java线程池总结

    一.线程池 线程池适合处理的任务:执行时间短.工作内容较为单一. 合理使用线程池带来的好处: 1)降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的开销 2)提高响应速度:当任务到达时,任务可 ...

  7. java 线程组作用_Java线程组(ThreadGroup)使用

    JDK 对线程组类注释: A thread group represents a set of threads. In addition, a thread group can also includ ...

  8. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

  9. java executor 源码_Java线程池ThreadPoolExecutor深度探索及源码解析

    我们的程序里,时常要使用多线程.因此多线程的管理变的尤为重要.ThreadPoolExecutor很好的解决了这一点.本篇文章主要从源码入手,分析ThreadPoolExecutor的原理. 1.标记 ...

最新文章

  1. 指定模块打包命令_大前端进阶之Babel、模块化、webpack
  2. 中国已经过了做手机操作系统的窗口期
  3. java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
  4. MIUI V5正式发布 全部功能展示PPT回看
  5. iPhone11因便宜销量超预期;三星手机曝高危漏洞;xUtils 3.8.3发布 | 极客头条
  6. maven 本地仓库添加jar包
  7. 异地多活,企业上云的必然趋势!
  8. Linux 配置rdate时间服务器方法
  9. 吉林大学超星MOOC高级语言程序设计 实验06 (2021级)
  10. pg(高斯)(postgreSQL)数据库修改字段长度
  11. Python学习视频教程大全
  12. php1蛋白质带电情况,拿到一个蛋白以后,首先需要对蛋白进行全面的了解,所谓知彼知己方能百战不殆:...
  13. 多边形的定义为什么要强调封闭图形_11.3.1 多边形讲解.ppt
  14. Java 在Word中创建多级项目符号列表和编号列表
  15. icloud验证失败连接服务器时出现问题,登录 iCloud 提示验证失败连接到服务器时出现问题怎么办及苹果iPhone手机安装两个微信教程...
  16. 计算机软件ae常用英语,AE英文插件该怎么翻译?
  17. RV1126RV1109 buildroot 增加GPIO测试程序
  18. SRS4.0源码分析-序言
  19. 2022年,中国餐饮数字化进行到哪一步了?
  20. layui table 复选框跳页后再回来保持原来选中的状态

热门文章

  1. 淘宝技术发展(引言)、技术发展(个人网站)
  2. UCS B200安装windows server 2003
  3. 关于Int自增字段和GUID字段的性能测试。只有测试,没有分析,呵呵
  4. 一款强大的cisco模拟配置、拓扑制作工具
  5. 博客园---博客美化汇总
  6. 微信小程序之旅一(注册页面的使用)
  7. Python3爬虫(六) 解析库的使用之Beautiful Soup
  8. 第三周读书笔记《程序员修炼之道》
  9. vuejs解析url地址
  10. 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes