线程介绍,异步,对象锁
2019独角兽企业重金招聘Python工程师标准>>>
Java多线程编程总结
线程基础:
当创建线程时,会为非static对象各自申请内存空间
卖票程序:
线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先级为5。
pupublic class Main {static int ticket = 10;static Runnable mRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {synchronized (this) {if (ticket > 0) {try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+ "卖出票-->" + ticket--);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {break;}}}}};public static void main(String[] args) {Thread t1 = new Thread(mRunnable, "线程, A\t");Thread t2 = new Thread(mRunnable, "线程, B\t");t1.setPriority(1);t2.setPriority(10);t1.start();t2.start();}
}
卖票程序(两线程各自有自己的票仓库)
将ticket设为non-static
public class MyThread implements Runnable {int ticket = 100;@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {synchronized (this) {if (ticket > 0) {try {Thread.sleep(10);System.out.println(Thread.currentThread().getName() + "卖出票-->" + ticket--);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {break;}}}}public static void main(String[] args) {Runnable run1 = new MyThread();Runnable run2 = new MyThread();Thread t1 = new Thread(run1,"线程 A\t");Thread t2 = new Thread(run2,"线程 B\t");t1.start();t2.start();try {t1.join(); System.out.println(t1.getName() + "卖完票");t2.join();System.out.println(t2.getName() + "卖完票");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
一个死锁案例:Java:多线程死锁
public class LockDemo implements Runnable{private static Object object1 = new Object();private static Object object2 = new Object();private int flag = 0;public static void main(String[] args) throws InterruptedException {LockDemo run0 = new LockDemo();LockDemo run1 = new LockDemo(); run0.flag = 1; //here run1.flag = 2; //Thread thread1 = new Thread(run0);Thread thread2 = new Thread(run1);thread1.start();thread2.start();}@Overridepublic void run(){System.out.println(flag);if (flag == 1){synchronized (object1){System.out.println("线程 : " + flag + "锁定obj1,休息0.5秒后锁定obj2去!");try{Thread.sleep(500);}catch (Exception e){e.printStackTrace();}synchronized (object2){System.out.println("线程 : " + flag + "访问 object2");}}}if (flag == 2){synchronized (object2){System.out.println("线程 : " + flag + "锁定obj2,休息0.5秒后锁定obj1去!");try{Thread.sleep(500);}catch (Exception e){e.printStackTrace();}synchronized (object1){System.out.println("线程 : " + flag + "访问object1");}}}}
}
结果:
2线程 : 2锁定obj2,休息0.5秒后锁定obj1去!1线程 : 1锁定obj1,休息0.5秒后锁定obj2去!
对象锁、notifyAll、notify、wait
wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,wait() 和notify()必须在synchronized函数或synchronized block中进行调用。
Calculator.java:
//计算线程
public class Calculator extends Thread {private int total;public int getTotal() {return total;}public void run() {synchronized (this) {for (int i = 0; i < 10; i++) {total += i;}// 通知所有在此对象上等待的线程notifyAll();}}
}
ReaderResult.java:
public class ReaderResult extends Thread {Calculator c;public ReaderResult(Calculator c) {this.c = c;}public void run() {synchronized (c) {try {System.out.println(Thread.currentThread() + "等待计算结果。。。");c.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "计算结果为:" + c.getTotal());}}public static void main(String[] args) {// 启动5个线程,分别获取计算结果Calculator calculator = new Calculator();for (int i = 0; i < 5; i++) {new ReaderResult(calculator).start();}// 启动计算线程calculator.start();}
}
结果:
Thread[Thread-1,5,main]等待计算结果。。。Thread[Thread-2,5,main]等待计算结果。。。Thread[Thread-3,5,main]等待计算结果。。。Thread[Thread-5,5,main]等待计算结果。。。Thread[Thread-4,5,main]等待计算结果。。。Thread[Thread-1,5,main]计算结果为:45Thread[Thread-4,5,main]计算结果为:45Thread[Thread-5,5,main]计算结果为:45Thread[Thread-3,5,main]计算结果为:45Thread[Thread-2,5,main]计算结果为:45
线程jion方法:等待该线程终止。等待调用join方法的线程结束,再继续执行。
public class Main {static class MyThread implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i < 5; i++) {try {Thread.sleep(1000);show("XIXI RUN->slower and slower");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public static void main(String args[]) {Runnable mRunnable = new MyThread();Thread t1 = new Thread(mRunnable, "xixi");t1.start();try {t1.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}show("MAIN RUN->CAN YOU BE FAST");}private static void show(String str) {System.out.println(str);}
}
结果:
XIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerMAIN RUN->CAN YOU BE FAST
转载于:https://my.oschina.net/u/660536/blog/369692
线程介绍,异步,对象锁相关推荐
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- android线程作用,Android线程介绍
进程与线程 进程:是操作系统的基础:是一次程序的执行:是一个程序及数据在处理机上顺序执行时所发生的活动:是程序在一个数据集合运动的过程:它是系统进行资源分配的一个独立单位. 线程:线程可以理解成是在进 ...
- 内置类和对象锁改变 笔记记录
当内置类是私有的,若实例化该类与内置类 在一个包下可以实例化.若不在一个包下要实例化,需要将内置类改为public package com.inner; public class PublicClas ...
- 《八股文》细数Java线程、并发、锁,温故而知新
<八股文>细数Java线程.并发.锁,温故而知新 基础 1. 并行.并发有什么区别? 2. 说说什么是进程和线程? 3. 说说线程有几种创建方式? 4. 为什么调用start()方法时会执 ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...
- Java 类锁、对象锁、私有锁
3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...
- Synchronize对象锁异步
对象锁异步 A线程,先持有对象的锁 b线程,可以以异步的方式,调用对象中的非synchronize修饰的方法 package com.bjsxt.base.sync003;/*** 对象锁的同步和异步 ...
- wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结
一.wait().notify().notifyAll()用法 obj.wait()/obj.wait(long timeout)是Object中的方法,当线程调用wait()方法,当前线程释放对象锁 ...
- 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )
文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...
最新文章
- Exchange 2010安装前的准备工作
- zcmu-1643 报数游戏
- C#数组解决约瑟夫环问题
- upc组队赛15 Supreme Number【打表】
- jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
- MySQL 深潜 - MDL 锁的实现与获取机制
- 批量更改数据库COLLATION
- 如果每天给你888元,只能看书学习,不能玩手机电脑,你能坚持多少天?
- c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT
- 网安学习日志(5)流量分析基础
- Java网络编程——UDP编程
- linux sybase 自动备份,sybase数据库 Linux环境下,每天定时全量备份+sybase数据库 stripe on 还原...
- Win7显示文件拓展名
- 意创坊-移动富媒体平台
- 卸载360企业版密码
- 仿写天猫tmall首页
- React:styled-components的使用
- Hadoop高频面试题(建议收藏)
- 微信输入法语音转文字的设计点
- 浅谈Android输入法(IME)架构
热门文章
- C#笔记 Public,Private,Protected,Internal,Protected internal
- git 换行符问题,统一linux风格
- JOOMLA中文安装时 数据库发生错误解块办法
- 使用苹果版博客编辑器发布的文章
- 3em html5,谁是最好的手机浏览器:IE9 VS Safari 5
- datatable数据插入mysql_DataTable 数据更新、删除、插入 数据库 操作
- Linux Kernel TCP/IP Stack — L1 Layer — Network Interface
- Netty+SpringBoot+FastDFS+Html5实现聊天App
- 傻瓜式操作Nagios图解
- A generic error occurred in GDI+的解决方案