升级版:

数据安全问题的解决

1、同步代码块

(弊端:降低了运行效率)

格式:(锁--同一把锁)

synchronized(任意对象){
多条语句操作共享数据的代码
}
//sellTicket.java
private int tickets=100;
private Object obj=new Object();//设置同一把锁
public void run(){
while(true){//死循环
if(tickets>0){//实现卖票
//通过sleep()方法模拟出票时间
synchronized(obj){//new Object()表示任意对象
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}
} //sellTicketDemo.java
sellTicket t1=new sellTicket(); Thread d1=new Thread(t1,"窗口1");
Thread d2=new Thread(t2,"窗口2");
Thread d3=new Thread(t3,"窗口3"); d1.start();
d2.start();
d3.start();

同步方法--锁对象this

//sellTicket.java
public void run(){
private int tickets=100;
private Object obj=new Object();
private int x=0;
while(true){//死循环
if(x%2==0){
if(tickets>0){//实现卖票
//通过sleep()方法模拟出票时间
synchronized(obj){//new Object()表示任意对象
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}else{
synchronized(obj){//new Object()表示任意对象
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}
} //sellTicketDemo.java
sellTicket t1=new sellTicket(); Thread d1=new Thread(t1,"窗口1");
Thread d2=new Thread(t2,"窗口2");
Thread d3=new Thread(t3,"窗口3"); d1.start();
d2.start();
d3.start();

同步静态方法--锁对象:类名.this

//sellTicket.java
public void run(){
private static int tickets=100;
private Object obj=new Object();
private int x=0;
while(true){//死循环
if(x%2==0){
if(tickets>0){//实现卖票
//通过sleep()方法模拟出票时间
synchronized(this){//this对象
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}else{
sell();
}
}
} private static synchronized void sell(){//方法
if(tickets>0){//实现卖票
//通过sleep()方法模拟出票时间
synchronized(obj){//new Object()表示任意对象
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
} //sellTicketDemo.java
sellTicket t1=new sellTicket(); Thread d1=new Thread(t1,"窗口1");
Thread d2=new Thread(t2,"窗口2");
Thread d3=new Thread(t3,"窗口3"); d1.start();
d2.start();
d3.start();

同步静态方法(格式):

修饰符 static synchronized 返回值类型 方法名(方法参数){}
线程安全的类:
//类中都有synchronized
StringBuffer//线程安全,可变化的字符序列
Vector//可变化的对象数组
//对线程安全无要求的话,建议用ArrayList代替Vector
Hashtable
相关应用:
List<String> list=Collections.synchronizedList(new ArrayList<String>());
//可使得List变成线程安全类
Lock锁
//锁对象是一个接口
//方法
void lock();//获得锁
void unlock();//释放锁
//实现类
ReentrantLock类
//构造方法:
ReentrantLock();
相关应用:
//sellTicket.java
public void run(){
private int tickets=100;
while(true){//死循环
try{
lock.lock();//获得锁
if(tickets>0){//实现卖票
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}finally{
lock.unlock();//释放锁
}
}
} //sellTicketDemo.java
sellTicket t1=new sellTicket(); Thread d1=new Thread(t1,"窗口1");
Thread d2=new Thread(t2,"窗口2");
Thread d3=new Thread(t3,"窗口3"); d1.start();
d2.start();
d3.start();
生产者消费者

//为了体现生产者和消费者之间的等待和唤醒,Java提供了几个方法,在Object类中
void wait();//导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法
void notify();//唤醒正在等待对象监视器的单个线程
void notifyAll();//唤醒正在等待对象监视器的全部线程
相关应用:(生产者消费者案例)

//BoxDemo.java
public class BoxDemo{
public static void main(String[] args){
//创建奶箱对象
Box b=new Box();
//创建生产者对象
Producer p=new Producer(b);
//创建消费者对象
Customer c=new Customer(b);
//创建两个线程对象
Thread t1=new Thread(p);
Thread t2=new Thread(c); //启动线程
t1.start();
t2.start(); }
}
//Box.java
public class Box{
private int milk;//第x瓶奶 private boolean state=false;//表示奶箱的状态 //定义两个方法,存储和获取牛奶
public synchronized void put(int milk){ if(state){//表示有牛奶,等待消费
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
//如果没有牛奶,进行生产
this.milk=milk;
System.out.println("送奶工将第"+this.milk+"瓶奶放入奶箱");
//生产完后
state=true;
//唤醒线程
notifyAll();
} public synchronized void get(int milk){
if(!state){//没有牛奶,等待生产
try{
wait();
}catch(InterrupedException e){
e.printStackTrace();
}
}
//有牛奶,进行消费
this.milk=milk;
System.out.println("消费者取走第"+this.milk+"瓶奶");
//消费完成后,等待生产
state=false;
//唤醒线程
notifyAll();
}
}
//Producer.java
public class Producer implements Runnable{
private Box b;
public Producer(Box b){
this.b=b;
}
public void run(){
for(int i=1;i<=5;i++){
b.put(i);
}
}
}
//Customer.java
public class Customer implements Runnable{
private Box b;
public Customer(Box b){
this.b=b;
}
public void run(){
while(true){
b.get();
}
}
}

网络编程

网络编程入门

网络编程概述

在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换;

(实现信息共享)

Java笔记第九弹的更多相关文章

  1. 菜鸡的Java笔记 第九 - java 接收键盘输入

    package mysterious; import java.util.Scanner; public class lianxi { public static void hhh (){ Scann ...

  2. Android群英传笔记——第九章:Android系统信息和安全机制

    Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个 ...

  3. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

  6. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  7. “全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java异常第九章:throws关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  9. servlet(6) - servlet总结 - 小易Java笔记

    垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...

  10. Java笔记 —— 继承

    Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...

随机推荐

  1. vue v-for 循环中,下拉框 el select 设置初始值 v-model

    效果图: 2.解决思路是,v-model 赋值 单独创建一个数组,然后用于接收下拉框的值,然后提交的时候,将这个数组的值,放到提交的数组中. 3.参考: 解决v-for中遍历多个el-select时, ...

  2. ES6的模块化(export导出)

    ES6 Module把一个文件当作一个模块,每个模块有自己的独立作用域,那如何把每个模块联系起来呢?核心点就是模块的导入(import)与导出(export). 模块化的好处: 防止命名冲突 代码复用 ...

  3. 同一系统开启两个ftp进程

    1.正常情况是yum 安装vsftpd服务 ,在/etc/vsftpd目录更改配置,起服务.这样启动是一个服务. 2.启动第二个vsftpd服务 #创建虚拟用户 useradd -d /home/vi ...

  4. 计蒜客(Stone Game)01背包

    题意:在集合中挑一些数,形成一个集合S,剩下的数形成另一个集合P,使得S>= P ,并且对于S中任意元素ai,S-ai<=P 问有多少种方案. 题目链接:https://nanti.jis ...

  5. 「SOL」旧试题 (LOJ/SDOI)

    数论+图论,妙不可言 # 题面 给定 \(A,B,C\),求: \[\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma_0(ijk) \] 数据规模:\(A,B,C\ ...

  6. POJ--2386题C++实现

    本题利用深度遍历的穷竭搜索法进行解题,即对每一个元素都对其进行各个方向的深度遍历,穷尽其周围 #include<iostream>#include<cstdio>using n ...

  7. 【Leetcode第286场周赛】——周赛总结

    1.5268. 找出两数组的不同 - 力扣(LeetCode) (leetcode-cn.com) 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 a ...

  8. SQL IIF函数的使用 判断为空数据不显示的问题

    先说说IIF函数 IIF函数 需要一个条件 两个值 当条件满足的时候 执行第一个值 条件不满足的时候 执行第二个值 IIF(判断条件,值1,值2) 今天判断数据的时候 发现当值为NULL或者为'    ...

  9. 蓝桥2020 B组 第一场考试

    2. 纪念日 问题描述: 请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包 含多少分钟? 答案提交: 这是一道结果填空题,你只需要算出结果后提交 ...

  10. 实验1 Python开发环境使用和编程初体验

    # print输出的几种用法 # 用法1:用于输出单个字符串或单个变量 print('hey, u') # 用法2: 用于输出多个数据项,用逗号分隔 print('hey', ' u') x,y,z ...