package com.lei.syn;

import java.util.ArrayList;
import java.util.List; //线程不安全集合
public class UnsafeList {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
for (int i = 0; i < 10000; i++) { new Thread(()->{
synchronized(list){
list.add(Thread.currentThread().getName());
} }).start(); }
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
} package com.lei.syn; public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket buyTicket=new BuyTicket(); new Thread(buyTicket,"A").start();
new Thread(buyTicket,"B").start();
new Thread(buyTicket,"C").start();
}
} class BuyTicket implements Runnable{ //票
private int ticketNums=10;
boolean flag=true;
@Override
public void run() {
//买票
while (flag){
try {
Buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} //synchronized同步方法
private synchronized void Buy() throws InterruptedException {
if(ticketNums<=0){
flag=false;
return;
}
//模拟延时
Thread.sleep(1000); //买票
System.out.println(Thread.currentThread().getName()+"拿到第"+ticketNums--+"张票");
}
} package com.lei.syn; public class UnsafeFeBand {
public static void main(String[] args) {
Account account = new Account(1000, "结婚基金"); Drawing you = new Drawing(account,50,"你");
Drawing girlfriend = new Drawing(account, 100, "女朋友"); you.start();
girlfriend.start();
}
} //账户
class Account{
int money;//余额
String name;//卡号 public Account(int money, String name) {
this.money = money;
this.name = name;
}
} //银行:模拟取款
class Drawing extends Thread{
Account account;//账户
//取了多少钱
int drawingMoney;
//现在手里多少钱
int nowMoney; String name; public Drawing(Account account, int drawingMoney, String name){
this.account=account;
this.drawingMoney=drawingMoney;
this.name=name;
} //取钱
@Override
public void run() {
synchronized (account){
//判断有没有钱
if(account.money-drawingMoney<0){
System.out.println(name + "钱不够,取不了");
return;
} try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} //余额=余额-取钱
account.money=account.money-drawingMoney;
//手里的钱
nowMoney=nowMoney+drawingMoney; System.out.println(account.name+"余额为:"+account.money);
//Thread.currentThread().getName()=this.getName()因为继承了Thread
System.out.println(name+"手里的钱"+nowMoney);
}
}
}

synchronized同步的更多相关文章

  1. Java多线程synchronized同步

    非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...

  2. synchronized同步块和volatile同步变量

    Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...

  3. java多线程(三)——锁机制synchronized(同步语句块)

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解 ...

  4. 使用synchronized同步,经典银行账户问题

    1.新建Account类,使用synchronized同步增加和减少金额方法. package com.xkzhangsan.synchronizedpack.bank; public class A ...

  5. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

  6. 转:JAVA 的wait(), notify()与synchronized同步机制

    原文地址:http://blog.csdn.net/zyplus/article/details/6672775 转自:https://www.cnblogs.com/x_wukong/p/40097 ...

  7. java synchronized 同步详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  8. 线程执行synchronized同步代码块时再次重入该锁过程中抛异常,是否会释放锁

    一个线程执行synchronized同步代码时,再次重入该锁过程中,如果抛出异常,会释放锁吗? 如果锁的计数器为1,抛出异常,会直接释放锁: 那如果锁的计数器为2,抛出异常,会直接释放锁吗? 来简单测 ...

  9. synchronized同步代码块锁释放

    今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637  问题线程的内容. &quo ...

  10. 59、synchronized同步代码块

    synchronized同步方法的问题 有些情况下,在方法上面加synchronized同步,会有性能问题.请看下面代码,来计算下两个线程执行的耗时: package com.sutaoyu.Thre ...

随机推荐

  1. python 小顶堆

    from heapq import *heap=[]for i in range(10,1,-1): heappush(heap,i)print(heap)print(heappop(heap))pr ...

  2. nodejs. cron风,定时任务时间写法

    export declare enum CronExpression { EVERY_SECOND = "* * * * * *", EVERY_5_SECONDS = " ...

  3. jquery 去除兄弟节点的class

    function chooseCategory(dicCode,obj){ $(obj).siblings('a').removeClass("active"); $(obj).a ...

  4. sxt_(003_007)_tomcat

    一.web服务器 接受浏览器请求,进行结果响应. 常见的web服务器:tomcat.jboss.weblogic.websphere.resin.jetty.二.tomcat下载: 去apache官网 ...

  5. VMware导入ovf报错

    如下图所示报错 在网上查找了一些解决方案,大都说是ovftool版本兼容问题,但是我这里好像并不行,最后的解决的办法是对导入的位置默认不做改动. 报错原因:改变了默认路径.

  6. windows下的故障自愈程序,可以实现进程,kafka按时间段判断状态,日志分级

    self-healing 1.使用python3.11写的一个故障自愈程序. 2.本程序在window2019 server运行测试通过 3.通过监控java程序里的详细启动包名来判断进程是否存在 4 ...

  7. 微信小程序-通过绑定事件进行传值

    一.数据绑定: <view bindtap="node" data-num="5"> 点击传值:{{nums}} </view> dat ...

  8. SY有了不适症状吃抗过敏药试试

    有了不适症状吃抗过敏药试试 Therapy for the eyes Providing welcome relief from the effects of daily stresses on th ...

  9. 配置全局路由表和VRF路由表之间的路由泄漏

    1.拓扑图 2.R1配置 R1#sho run Building configuration... Current configuration : 1360 bytes ! upgrade fpd a ...

  10. python func_timeout 设置函数超时退出

    使用func_timeout设置函数超时退出,使用func_set_timeout装饰器和func_timeout方法 from func_timeout import func_set_timeou ...