使用取钱的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的更多相关文章

  1. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  2. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  3. Java—多线程编程

    一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...

  4. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  5. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  6. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  7. Java多线程编程核心技术---Java多线程技能

    基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...

  8. Java多线程编程——进阶篇二

    一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个 ...

  9. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

随机推荐

  1. LINUX_记录(一)

    我有了一台电脑,有好多的硬件,CPU啊.内存啊.光驱啊.硬盘啊等等,我不想装windows,我想装linux,我就装了一个linux.事实上,可以跑,没问题,我在思考,why? 我装的linux,包括 ...

  2. mplayer+ffmpeg 组合截图

    mplayer截图的优点:对于一个时长很长的视频,可以任意指定一个时间点截图,mplayer会直接跳到这个时间点开始解码截图: 缺点:由于是直接跳到指定的时间点,也就是直接跳过了之前的帧,这样解码出来 ...

  3. Go语言设计模式汇总

    目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...

  4. golang开发:类库篇(四)配置文件解析器goconfig的使用

    为什么要使用goconfig解析配置文件 目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量.例如,生产环境跟测试环 ...

  5. micropython TPYBoard v201 简易的web服务器的实现过程

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 TPYBoard v201开发板上搭载了以太网 ...

  6. UVA663 Sorting Slides(烦人的幻灯片)

    UVA663 Sorting Slides(烦人的幻灯片) 第一次做到这么玄学的题,在<信息学奥赛一本通>拓扑排序一章找到这个习题(却发现标程都是错的),结果用二分图匹配做了出来 蒟蒻感觉 ...

  7. Mysql 时间相关

    -- 当前时间SELECT NOW(), SYSDATE(), CURRENT_TIMESTAMP(), LOCALTIME(), LOCALTIMESTAMP();SELECT CURDATE(), ...

  8. [剑指offer] 3. 从头到尾打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...

  9. mount命令中offset参数的意义

    mount命令中offset参数的意义        感觉好久没有来写东西了,最近一直忙个不停,今天也一样,总感觉时间不够用,唉,这里来临时总结一下工作中的一点小收获吧.今天要说的是我们常用的解压IM ...

  10. CMS简单内容管理系统

    架构 NewsDaoSQLServerImpl public class NewsDaoSQLServerImpl extends BaseDao implements NewsDao { publi ...