使用取钱的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. 云开发新能力,支持 HTTP 调用 API

    今天来上班打开电脑,总感觉微信开发文档哪里有点不太一样,研究了半天原来是云开发又多了神级功能--HTTP API! HTTP API是什么?简单来说就是通过云开发HTTP API,可以不需要通过微信小 ...

  2. 基于Vue的通用框架Nuxt.js

    问题:最近有些朋友问我写官网,用Vue框架实现好不好? 相信很多使用Vue的小伙伴们一样疑惑这个问题,其实从这个问题就可以知道你对Vue这个框架是否真的熟悉了.其实单单使用Vue这个框架来做官网的,其 ...

  3. Thread API的详细介绍

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurr ...

  4. [译]为任意网格计算tangent空间的基向量

    +BIT祝威+悄悄在此留下版了个权的信息说: [译]为任意网格计算tangent空间的基向量 Computing Tangent Space Basis Vectors for an Arbitrar ...

  5. 盘一盘 synchronized (二)—— 偏向锁批量重偏向与批量撤销

    在本文讲解之前,先来简单了解一下为什么会有批量重偏向和批量撤销.   批量重偏向:当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,会导偏向锁重偏向的操作 ...

  6. PhpCms V9中的{date('Y-m-d',$r[inputtime])}问题解决方法

    不少朋友会碰到这个问题:在PhpCms V9中的首页或者文章内容页调用发布时间{date('Y-m-d',$r[inputtime])}调用显示1970-01-01,然后尝试用截断的方法也没有成功,应 ...

  7. 关于JS、JQ首行首列固定展示

    当时遇见这个问题 是医院手麻系统大批量数据展示,由于是旧项目系统没有使用到前端的架构 只能使用JQ,JS, css完成 也谢谢给予我支持的同行们 固定首行数据: 采用函数的方式进行  JQ /** * ...

  8. 我与微笑哥以及 Java 极客技术的前世今生

    ​关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...

  9. OV SSL证书有哪些功能?网站安装OV SSL证书的好处

    OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...

  10. Eclipse中代码自动添加注释及代码注释模板

    介绍 为了提高代码的可读性以及为了有些代码有洁癖的人的需求,我们要从学生到职业进行迈进的过程中,必须把以前的那种代码可读性不高的习惯改掉,因为我们必须要与企业接轨.. 好了,废话不多说,反正就是提升自 ...