多线程编程-synchronized
使用取钱的demo来模拟实现线程的同步
package com.iotec.synchronizedTest;
import java.io.ObjectInputStream;
public class BankDemo {
public static void main(String[] args) {
Bank bank = new Bank();
BankThread p1 = new BankThread(bank);
p1.start(); //柜台取钱
BankThread p2 = new BankThread(bank);
p2.start(); //ATM机上取钱
}
}
class BankThread extends Thread{
private Bank bank = null;
public BankThread(Bank bank){
this.bank = bank;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"取钱:"+bank.getMoney(400));
}
}
class Bank {
//把竞争访问的资源标识为private
private int money = 500;
private Object object = new Object();
//取钱的方法,返回取钱的数目
//当一个线程去调用同步方法的时候,这个线程就获得当前对象的锁
//其它线程当调用同步方法的时候只能等待,因为无法获取对象的锁
//只有第一个线程释放对象的锁方可进入
/* public synchronized int getMoney(int number){
if(number<0){
return -1;
}else if(money<0){
return -2;
}else if(number-money>0){
return -3;
}else {
try {
Thread.sleep(1000); //模拟取钱的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
money -= number;
System.out.println("余额:"+money);
}
return number;
}*/
public synchronized int getMoney(int number){
// synchronized (this){
//可以持有的是任何对象
synchronized (object){
if(number<0){
return -1;
}else if(money<0){
return -2;
}else if(number-money>0){
return -3;
}else {
try {
Thread.sleep(1000); //模拟取钱的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
money -= number;
System.out.println("余额:"+money);
}
return number;
}
}
/* public synchronized int getMoney(int number){
if(number<0){
return -1;
}else if(money<0){
return -2;
}else if(number-money>0){
return -3;
}else {
//放在这里是不对的,因为等第一个线程执行完,第二个线程对上面的逻辑并不会进行判断
//所以需要考虑清楚需要同步的是哪一个代码块
synchronized (this){
try {
Thread.sleep(1000); //模拟取钱的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
money -= number;
System.out.println("余额:"+money);
}
}
return number;
}*/
}
使用printChar来模拟线程的同步
Object obj = new Object();
new Thread() {
@Override
public void run() {
synchronized (obj) {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B");
if (i % 4 == 0) {
try {
obj.wait();//释放锁
obj.notify();//唤醒打印AAAAA 的线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}.start(); new Thread() {
@Override
public void run() {
synchronized (obj) {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("AAAAA");
try {
obj.notify();//唤醒打印B的线程
obj.wait();//释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
使用另一个demo来模拟线程的死锁
package com.iotec.synchronizedTest;
public class DieThreadDemo {
public static void main(String[] args) {
Example example = new Example();
DieThread1 dieThread1 = new DieThread1(example);
dieThread1.start();
DieThread2 dieThread2 = new DieThread2(example);
dieThread2.start();
}
}
class DieThread1 extends Thread{
private Example example = null;
public DieThread1(Example example){
this.example = example;
}
@Override
public void run() {
example.method1();
}
}
class DieThread2 extends Thread{
private Example example = null;
public DieThread2(Example example){
this.example = example;
}
@Override
public void run() {
example.method2();
}
}
class Example{
private Object obj1 = new Object();
private Object obj2 = new Object();
public void method1(){
synchronized (obj1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2){
System.out.println("method1");
}
}
}
public void method2(){
synchronized (obj2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1){
System.out.println("method2s");
}
}
}
}
多线程编程-synchronized的更多相关文章
- Java多线程编程(四)—浅谈synchronized与lock
一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java—多线程编程
一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- Java多线程编程核心技术---Java多线程技能
基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...
- Java多线程编程——进阶篇二
一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习: void notify() 唤醒在此对象监视器上等待的单个 ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
随机推荐
- 云开发新能力,支持 HTTP 调用 API
今天来上班打开电脑,总感觉微信开发文档哪里有点不太一样,研究了半天原来是云开发又多了神级功能--HTTP API! HTTP API是什么?简单来说就是通过云开发HTTP API,可以不需要通过微信小 ...
- 基于Vue的通用框架Nuxt.js
问题:最近有些朋友问我写官网,用Vue框架实现好不好? 相信很多使用Vue的小伙伴们一样疑惑这个问题,其实从这个问题就可以知道你对Vue这个框架是否真的熟悉了.其实单单使用Vue这个框架来做官网的,其 ...
- Thread API的详细介绍
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurr ...
- [译]为任意网格计算tangent空间的基向量
+BIT祝威+悄悄在此留下版了个权的信息说: [译]为任意网格计算tangent空间的基向量 Computing Tangent Space Basis Vectors for an Arbitrar ...
- 盘一盘 synchronized (二)—— 偏向锁批量重偏向与批量撤销
在本文讲解之前,先来简单了解一下为什么会有批量重偏向和批量撤销. 批量重偏向:当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,会导偏向锁重偏向的操作 ...
- PhpCms V9中的{date('Y-m-d',$r[inputtime])}问题解决方法
不少朋友会碰到这个问题:在PhpCms V9中的首页或者文章内容页调用发布时间{date('Y-m-d',$r[inputtime])}调用显示1970-01-01,然后尝试用截断的方法也没有成功,应 ...
- 关于JS、JQ首行首列固定展示
当时遇见这个问题 是医院手麻系统大批量数据展示,由于是旧项目系统没有使用到前端的架构 只能使用JQ,JS, css完成 也谢谢给予我支持的同行们 固定首行数据: 采用函数的方式进行 JQ /** * ...
- 我与微笑哥以及 Java 极客技术的前世今生
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...
- OV SSL证书有哪些功能?网站安装OV SSL证书的好处
OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...
- Eclipse中代码自动添加注释及代码注释模板
介绍 为了提高代码的可读性以及为了有些代码有洁癖的人的需求,我们要从学生到职业进行迈进的过程中,必须把以前的那种代码可读性不高的习惯改掉,因为我们必须要与企业接轨.. 好了,废话不多说,反正就是提升自 ...