设置需要片刻时间,并且设置完成后会自动重启电脑的。
下载地址: https://aka.ms/wsl-ubuntu-1604 ,(如果你想下载1804直接把地址后面的数字改成 1804 就好),下载完成后的后缀名是 appx ,直接重命名为 zip 压缩包就好,然后解压。解压后,里面有个 ubuntu.exe 文件,直接打开该文件,然后输入用户名和密码初始化账号就能用了。
安装成功之后,在 powershell 或 cmd 中输入 wsl 或 bash ,都会直接切换到 ubuntu 的终端的,如下:
但是由于不管是 cmd 还是 powershell ,都是特别难用,所以,为了更好的体验,我们可以使用 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 [系统名称]
来删除,如下:
/** * 售票 * 使用synchronized同步方法 */ private synchronized void sale() { if(count<=0){ flag=true; return; } //剩余的票数 减1 count--; //抢到第几张票 加1 num++; System.out.println(Thread.currentThread().getName()+"抢到第"+num+"张票,剩余"+count+"张票。"); }
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+"张票。"); } } }}
不可控性,无法做到随心所欲的加锁和释放锁。
效率比较低下,比如我们现在并发的读取两个文件,读与读之间是互不影响的,但如果给这个读的对象使用synchronized来实现同步的话,那么只要有一个线程进入了,其他的线程都要等待。
无法知道线程是否获取到了锁。
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(); } }}