网赚平台

  • 请收藏我们:www.ohoyoo.com
网赚文章更多 >
精品源码更多 >
区块链更多 >
大数据更多 >
微营销更多 >
黑科技更多 >
教程分享更多 >
杂谈心得更多 >
最新消息

易方达:一起打call,免费领0.3元微信红包!

易方达基金“一起为300增强打call”的活动,活动期间,参与发售提醒,也就输入手机号时收个验证码,即可免费领取0.3元微信红包,秒推送!【有效时间】即日起至2020年12月11日【操作方法】1.在微信打开下方链接http://h5.upcircle.cn/l...

win10 下安装 ubuntu 子系统的完全指北

设置需要片刻时间,并且设置完成后会自动重启电脑的。

下载 ubuntu 子系统

下载地址: https://aka.ms/wsl-ubuntu-1604 ,(如果你想下载1804直接把地址后面的数字改成 1804 就好),下载完成后的后缀名是 appx ,直接重命名为 zip 压缩包就好,然后解压。解压后,里面有个 ubuntu.exe 文件,直接打开该文件,然后输入用户名和密码初始化账号就能用了。

安装成功之后,在 powershell 或 cmd 中输入 wsl 或 bash ,都会直接切换到 ubuntu 的终端的,如下:

但是由于不管是 cmd 还是 powershell ,都是特别难用,所以,为了更好的体验,我们可以使用 windows terminal 新终端。下面再来介绍一下如何安装。

安装 windows terminal

首先下载 windows terminal :
https://github.com/microsoft/terminal/releases

下载的文件是 msixbundle 类型的文件,所以需要 powershell 中输入以下命令进行安装:

Add-AppxPackage ./[文件名xxx].msixbundle

必须要使用 powershell 而不能使用 cmd ,因为 Add-AppxPackage 命令只在 powershell 中存在。

安装完成后,打开 windows terminal , 在新建窗口旁边的下拉菜单里面可以选择 ubuntu 系统了。

注意事项:

  • 因为公司的系统限制了 microsoft store 的使用,所以 wsl(Windows-Subsystem-Linux) 和 windows terminal 只能手动下载安装

  • 如果你不小心把子 ubuntu 子系统给玩坏了,想要卸载重新安装,可以通过 wslconfig /l 来查看该系统的名称,然后通过 wslconfig /u [系统名称] 来删除,如下:
    win10 下安装 ubuntu 子系统的完全指北

最近在搞 C++ 相关的东西,因为在 Linux 下开发会比较流畅舒适,而公司配的电脑都是 windows 的,之前都是在 vmware 中安装个 ubuntu 虚拟机,但这种有时候比有点卡顿。所以今天就尝试一下看有没有其他的途径,结果发现了 win10 的...

Python高级编程--03

自定义一个向量#from icecream import icimport mathclass Vector:#告诉解释器只有x,y两个变量,不会再有__dict__属性,节省内存__slots__ ...

python基本数据类型都在这里

前言python中列表,元祖,字典怎么还分不清,随便看看,看完不会我给你买iphone12!一、列表1.什么是列表类比其他语言的数组强大的地方在于列表中的元素可以是不同类型的,到底有多强,上代码。my_list = [1, &qu...

GitLab使用教程(详细)

一、基本操作 1.登录:2.修改密码:二、项目管理1.新建项目2.编辑或删除项目三、用户管理(管理员使用,非管理员跳过此步骤)1.新建用户2.编辑和删除用户四、组管理(管理员使用,非管理员跳过此步骤)1.新建组2.编辑或删除组3.添加组成员4.修改成员的权限(...

通过一个简单的java示例,来学习解决“线程不安全”的思路

解析:通过以上结果可知,这个线程是不安全的,用户的并发请求,导致多个用户同时抢到了第10张票。

方法一:悲观锁思路,使用synchronized关键字

悲观锁(Pessimistic Lock),每次去查询数据的时候都认为别人会修改,所以每次在查询数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了这种锁机制,比如通过select ....for update进行数据锁定。

synchronized是一种同步锁(悲观锁),可修饰实例方法,静态方法,代码块。synchronized关键字代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。具体使用方法如下表所示:

1、使用 synchronized同步方法,只需要在在sale()方法上添加 synchronized即可,如下:

/**	 * 售票	 * 使用synchronized同步方法	 */	private synchronized void sale() {			if(count<=0){				flag=true;				return;			}			//剩余的票数 减1			count--;			//抢到第几张票 加1			num++;			System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票。");	}

2、使用synchronized同步代码块,效果和synchronized同步方法是一样的,线程代码修改为:

public class TicketRunnable implements Runnable {	//剩余的票数	static int count=10;	//抢到第几张票	static int num=0;	//是否售完票	boolean flag=false;		@Override	public void run() {		// TODO Auto-generated method stub		//票没有售完的情况下,继续抢票		while (true) {			//使用synchronized同步代码块			synchronized (this) {				if(count<=0){					break;				}				//剩余的票数 减1				count--;				//抢到第几张票 加1				num++;				System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票。");			}			}	}}

3、来看看最终的运行结果:

 

解析:通过以上结果可知,这个线程算是安全的,但却有弊端,没有公平性可言,有些用户压根抢不到票,有些用户则抢到了好几张票。 

结论:在“高并发 ”的抢购场景里使用悲观锁不太合理,用户并发请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接进程数被耗尽,系统陷入“雪崩”状态。

方法二:Lock锁机制

我们在使用synchronized关键字的时候会遇到下面这些问题:

  1. 不可控性,无法做到随心所欲的加锁和释放锁。

  2. 效率比较低下,比如我们现在并发的读取两个文件,读与读之间是互不影响的,但如果给这个读的对象使用synchronized来实现同步的话,那么只要有一个线程进入了,其他的线程都要等待。

  3. 无法知道线程是否获取到了锁。

而上面synchronized遇到的这些问题,Lock都可以很好的解决,并且jdk1.5以后,还提供了各种锁(例如读写锁),但有一点需要注意,使用synchronized关键字时,无须手动释放锁,但使用Lock必须手动释放锁。

1、我们修改线程代码:

import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class TicketRunnable implements Runnable {	// 剩余的票数	static int count = 10;	// 抢到第几张票	static int num = 0;	// 是否售完票	boolean flag = false;	// 定义锁对象	final Lock lock = new ReentrantLock();	@Override	public void run() {		// TODO Auto-generated method stub		// 票没有售完的情况下,继续抢票		while (!flag) {			sale();		}	}	/**	 * 售票	 */	private void sale() {		// 加锁		lock.lock();		try {			// 需要保证线程安全的代码放在try{}里			if (count <= 0) {				flag = true;				return;			}			// 剩余的票数 减1			count--;			// 抢到第几张票 加1			num++;			System.out.println(Thread.currentThread().getName() + "抢到第" + num + "张票,剩余" + count + "张票。");		} finally {			// 解放锁			lock.unlock();		}	}}

2、运行结果:

结论:从运行的结果来看,lock.lock()是对当前线程加锁,当线程执行完毕后调用lock.unlock()释放锁,这时候其他线程才可以去获取锁,至于是哪一个线程可以争抢到锁还是得看CPU的调度 。这个还是和悲观锁一样,没有公平性可言。

方法三:MySQL的事务

这个方法是在操作数据库时有效,使用MySQL的事务,锁住操作的行,其它事务必须等待此次事务提交后才能执行。

方法四:FIFO队列思路

我们直接将用户的请求放入队列中的,采用FIFO模式(First Input First Output,先进先出),这样的话,就不会导致某些请求永远获取不到锁的情况。先进先出(FIFO)的定义是先插入队列的元素也最先出队列,类似于排队的功能,从某种程度上来说这种队列也体现了一种公平性。

一、什么是线程安全?线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。多个线程同时运行同一段代码,如果每次运行结果和单线程运...

基于Ansible和CodeDeploy的DevOps解决方案

名词解释:Ansible:由红帽Red Hat开源并主导的自动化运维工具,帮助运维实现IT自动化,降低人为操作错误,提高业务自动化率,提升运维工作效率。Ansible常用于软件部署自动化、配置自动化、管理自动化、软件平滑升级等。它拥有丰富的内置模块,并且有开放...

支持Web UI数据库审计和敏感数据国密算法加密,JumpServer堡垒机v2.5.0发布丨Release Notes

11月18日,JumpServer开源堡垒机正式发布v2.5.0版本。该版本的新增功能包括:支持Web UI数据库审计(X-Pack增强包内)、支持敏感数据国密算法加密、新增克隆创建、新增高危命令告警,支持设置告警接收邮件,资产导入支持通过节点名称的导入方式。...

汽车报价,集盲盒,免费领红包!

支付宝里的生活号“汽车报价”又开始送红包了,这次活动叫“集盲盒大挑战,百万红包大放送”,进入后可以免费开盲盒,金额随机,估计我是最差的奖励,只中了0.08元,秒到支付宝余额!【有效时间】即日起至2020年12月17日【操作方法】1.打开支付宝扫码进入2.获取抽...

Rabbitmq 交换器同时配置使用的问题

配置了一个主题交换器和一个主题队列  、一个广播交换器和一个广播队列。  结果SpringBoot启动报错! package com.example.demo.config.queue;import org.s...