Java 线程多线程编程2---线程同步
来模拟一个死锁(互相等待):
TestDeadLock.java
package com.zhj.www;public class TestDeadLock implements Runnable {public int flag = 1;static Object o1 = new Object();static Object o2 = new Object();public void run() {System.out.println("flag=" + flag);if(flag ==1) {synchronized (o1) {try {Thread.sleep(500);}catch (Exception e) {e.getStackTrace();}synchronized (o2) {System.out.println("1");}}}if(flag ==0) {synchronized (o2) {try {Thread.sleep(500);}catch (Exception e) {e.getStackTrace();}synchronized (o1) {System.out.println("0");}}}}public static void main(String[] args) {TestDeadLock td1 = new TestDeadLock();TestDeadLock td2 = new TestDeadLock();td1.flag = 1;td2.flag = 0;Thread t1 = new Thread(td1);Thread t2 = new Thread(td2);t1.start();t2.start();}}
运行结果:
我们发现程序处于已知等待的情况下。
哲学家吃饭问题(多个线程死锁):
怎么解决?把锁的粒度加粗,不如把整个对象锁住,而不是只是锁几行。
粒度:实现数据库的产品,锁在行一级还是表一级。
面试题:
package com.zhj.www;
public class TestInterviewQuestion1 implements Runnable {int b =100;public synchronized void m1() {try {b = 1000;Thread.sleep(5000);System.out.println("b = "+b);} catch (Exception e) {e.getStackTrace();}}public void m2() {System.out.println(b);}public void run() {try {m1();}catch (Exception e) {e.getStackTrace();}}public static void main(String[] args) throws Exception{TestInterviewQuestion1 testInterviewQuestion1 = new TestInterviewQuestion1();Thread thread = new Thread(testInterviewQuestion1);thread.start();Thread.sleep(1000);testInterviewQuestion1.m2();}
}
运行结果:
1000
b = 1000
修改一下:
package com.zhj.www;public class TestInterviewQuestion1 implements Runnable {int b =100;public synchronized void m1() {try {b = 1000;Thread.sleep(5000);System.out.println("b = "+b);} catch (Exception e) {e.getStackTrace();}}public synchronized void m2() throws Exception {Thread.sleep(2500);b = 2000;}public void run() {try {m1();}catch (Exception e) {e.getStackTrace();}}public static void main(String[] args) throws Exception{TestInterviewQuestion1 testInterviewQuestion1 = new TestInterviewQuestion1();Thread thread = new Thread(testInterviewQuestion1);thread.start();//Thread.sleep(1000);testInterviewQuestion1.m2();System.out.println(testInterviewQuestion1.b);}
}
对每个方法加不加锁,要考虑清楚。
互斥:某个时间段,只有一个线程进入这个方法,但不保证不进入另外一个线程。
不允许多个线程同时写,但允许多个线程读。
Java 线程多线程编程2---线程同步相关推荐
- Java 线程多线程编程3---线程同步之生产者与消费者问题
生产者与消费者问题: 第一步:把架子搭起来 package com.zhj.www;public class ProceduerConsumer {public static void main(St ...
- 多线程编程、线程同步|安全和线程通信
多线程编程 多线程的优势 线程在程序中是独立的.并发的执行流,与分隔的进程相比,进程中的线程之间的隔离程度要小.他们共享内存.文件句柄和其他每个进程应有的状态. 因为线程的划分尺度小于进程,使得多线程 ...
- 廖雪峰Java11多线程编程-1线程的概念-1多线程简介
多任务 现代操作系统(windows,MacOS,Linux)都可以执行多任务: 多任务就是同时运行多个任务,例如同时开启钉钉.百度网盘.火狐.谷歌.ps等 操作系统执行多任务就是让多个任务交替执行, ...
- 多线程编程之三——线程间通讯
七.线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而 ...
- 多线程编程(2): 线程的创建、启动、挂起和退出
python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form{//声明线程数组Thread[] workThreads = new Thread[10 ...
- 多线程编程:线程死锁的原因以及解决方法
多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...
- Python多线程编程之线程子类化
Python多线程编程之线程子类化 基本思路 Threading模块简介 **MyThread**主要代码 实例 所有代码 运行结果 基本思路 导入Threading模块下的Thread类,将其子类化 ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
最新文章
- R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行独立成分分析ICA(Independent components analysis)、设置method参数为ica
- c语言程序设计江宝钏实验六答案,《C语言程序设计》(江宝钏著)实验三答案.doc...
- java变量只声明未初始化是否可以直接使用?
- 安卓手机的加密设备和加密外置SD卡
- C++编程练习:多态实验——设计一个基类Shapes,Shapes类公有派生产生矩形类Rectangle和圆类Circle
- 通过 SAP Spartacus 的 Component 映射机制,更改默认购物车 Cart 页面
- 『操作系统』 进程的描述与控制 Part3 管程
- [C++11]函数模板的默认模板参数
- java模拟登陆_java-模拟登陆练习(示例代码)
- 处理后台返回文本带空格和换行页面不显示断句的问题
- 开放下载!《OSS运维基础实战手册》
- Linux下Weblogic创建域方法和步骤
- MIT新研究:基于基本运动能力让机器人自主学习,感知世界
- mysql数据库索引回表_简述 MySQL 数据库的覆盖索引与回表
- 原生JavaScript实现查找汉字首字母
- 前端表白Html+css+js,表白源码,520和七夕告白,雪花爱心记录
- wordcloud 配置项_wordcloud从安装到入门
- 计算机主机需要ccc,计算机3C认证怎么办理,要什么资料
- 其实软件测试工程师也是程序员,很多人不知道
- 野火电机+CUBEMX——直流有刷电机的实现
热门文章
- java apache.poi_Java Apache POI
- mysql自增_面试官:为什么 MySQL 的自增主键不单调也不连续?
- 频域/s域/z域三大变换的发展史及其联系
- linux实现shell,linux
- wdcp mysql密码_wdcp默认的mysql密码是多少?
- 如何复制mysql数据库_怎么复制mysql数据库到另一台电脑上?
- 博客园的编辑器毛病真多.....
- [译]如何在visual studio中调试Javascript
- IrregularGridCollectionView处理不定宽度的标签cell
- sphinx数据文件简析