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);}
}

对每个方法加不加锁,要考虑清楚。

互斥:某个时间段,只有一个线程进入这个方法,但不保证不进入另外一个线程。

不允许多个线程同时写,但允许多个线程读。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络编程1---基础

TCP/IP:事实上的标准 自己编的应用程序:应用层 TCP/UDP层 IP层 物理层 数据封装:第五层只与第四层打交道。 数据拆封《TCP/IP详解》网络底层 IP巨大的贡献:提供了独一无二的IP地址。 内网IP:虚假的 子网掩码:255.255.2…

Java网络编程2---Socket-TCP编程

Sockct:插座Socket是关于TCP的。 端口号:两个字节->65536个端口号,一个应用程序占多个端口号; 但是假设一个应用程序占一个端口号;一台电脑会有65535个应用程序。 自己编写程序要占用端口号1024以上后的。 80端口:网…

winform绑定多张图片

开发winform程序的时候经常设计到要显示多张图片的问题,其解决思路一般是先遍历文件夹中的所有图片,然后再把这些图片添加到ImageList控件中,最后再绑定显示出来。这里我们介绍两种绑定的方法: (一)动态生成…

Java网络编程3---Socket-UDP编程

栗子:TestUDPServer.java 服务器端: package com.zhj.www;import java.net.DatagramPacket; import java.net.DatagramSocket;public class TestUDPServer {public static void main(String[] args)throws Exception {byte buf[] new byte[1024];Datagr…

iOS 6 自动布局入门

http://www.raywenderlich.com/zh-hans/22873/ios-6-自动布局-入门-1转载于:https://www.cnblogs.com/ihojin/p/auto-layout.html

Java GUI 基础知识

这部分主要包含AWT、组件和容器、布局管理器Component:所有可以和用户交互的图形元素,他的子类有:输入框… Java.awt及其子包 Container:容器,容纳其他各种各样的Component的元素。 Panel:可以容纳其他元素…

UVA11300

初步解题原理:代数运算单元素极值 代数运算: xi表示第i个给i-1的数量,正负表示给或得 c(a1a2a3....an)/n a1-x1x2c -->x2x1-a1c a2-x2x3c -->x3x1-a1-a22c a3-x3x4c -->x4x1-a1-a2-a33c ...... an-xnx1c -->xnx1-a1-a2-a3....-a(n-1)(n-1)c ansmax{|x1|…

Java GUI 基础知识2 监听机制

TestActionEvent.java没有调用方法,但是有反应。反应自己要编写程序有反应。 事件模型:一定要有某些反应。 写程序,监听的操作是自动发生的,一直监听。钩子函数,(回调函数) 怎么让它自动执行&am…

求字符串的最长回文字串 O(n)

昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串。我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来。 回头我把这道题目再…

数据结构 二、向量(接口与实现and可扩容向量)

ADT操作实例:Disordered:显示出3对逆序紧邻对。Vector模板类初始有效空间为0;基于复制的构造描述区间:左闭右开 为什么*2?有限时间内不必要为扩容而打断。 2、可扩充向量左移一位:加一倍

数据库:mysql 获取刚插入行id[转]

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。 下面介绍三种方法 (1) getGeneratedKeys()方法: 程序片断: Connection conn ; …

svn由于连接方在一段时间后没有正确答复或连接的主机没有反应连接尝试失败...

解决方法,关掉防火墙, service iptables status 查看iptables状态 service iptables restart iptables服务重启 service iptables stop iptables服务禁用 转载于:https://www.cnblogs.com/jiqing9006/p/3347441.html

Android 服务(Service)

一、服务的解释 服务(Service)是Android中实现后台运行的解决方案,它适合那些去执行不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖任何的与任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应…

CenOS 配置C/C++语言

1.下载eclipseCDT组合包。 2.电脑上安装GCC, G 3.在eclipse上创建一个C project 4. Eclipse CDT功能很强大,安装完虽然可以编译运行c程序,但有个问题,就是找不到c标准库的头文件,无法打开诸如之类的文件,编…

(数据结构)前缀,后缀以及中缀表达式

中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 前缀表达式(前缀记法、波兰式) 前缀表达式是一种没有括号的算术表…

Moravec角点检测算子

Moravec角点检测算子 Moravec 在1981年提出Moravec角点检测算子[1],并将它应用于立体匹配。 首先, 计算每个像素点的兴趣值, 即以该像素点为中心, 取一个w*w(如:5x5)的方形窗口, 计算0度、45度、90度、135度四个方向灰度差的平方和, 取其中的最小值作为该像素点的兴…

java习题-练习1

1、 Given the string, check if it is a palindrome.(回文) Example For inputString "aabaa", the output should becheckPalindrome(inputString) true;For inputString "abac", the output should becheckPalindrome(inputSt…

文件夹生成工具

很简单的一个小工具,输入一个字符串,可以为你生成相应的文件夹. 至于有什么用?我公司一个策划拿一顿饭给我要的. 下载地址: http://pan.baidu.com/s/1d0ewl 转载于:https://www.cnblogs.com/WhyEngine/p/3350053.html

java中System.exit(1)、System.exit(0)、以及return的区别

System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序System.exit(status)不管status为何值都会退出程序。 和return 相比有以下不同点:return是回到上一层,而System.exit(status)是回到最上层

(转载)深入理解Linux中内存管理---分段与分页简介

首先,必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术。 来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的。换句话说,就是程序在运行的过程中访问的都是物理地址。如果这个系统只运行一个程序&…