多线程数据共享之卖票问题

来看一道经典的多线程问题,多个售票窗口卖票:涉及到线程的创建,资源的掠夺,语法新特性等等。 ps:使用了jdk8的新特性 不懂请 看?jdk8新特性

public class ThreadTest03 { public static void main(String[] args) { TicketWindow ticketWindow = new TicketWindow(2000); List<Thread> list = new ArrayList<>(); // 用来存储买出去多少张票 List<Integer> sellCount = new Vector<>(); //200窗口卖2000张票 for (int i = 1; i < 200; i++) { Thread t = new Thread(() -> { try { //暴露问题 sleep(randomAmount()); } catch (InterruptedException e) { e.printStackTrace(); } // 分析这里的竞态条件 每个窗口卖的票数是随机的 int count = ticketWindow.sell(randomAmount()); sellCount.add(count); },””+i); list.add(t); t.start(); } list.forEach((t) -> { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } }); // 买出去的票求和 System.out.println(“一共卖了 :” + sellCount.stream().mapToInt(c -> c).sum()); // 剩余票数 System.out.println(“最后剩余票数” + ticketWindow.getCount()); } // Random 为线程安全 static Random random = new Random(); // 随机 1~5 public static int randomAmount() { return random.nextInt(5) + 1; }}class TicketWindow { private int count; public TicketWindow(int count) { this.count = count; } public int getCount() { return count; } //资源竞争 public synchronized int sell(int amount) { if (this.count >= amount) { this.count -= amount; System.out.printf(“窗口 %s 卖了 %d 张,剩余 %d 张票\n”,Thread.currentThread().getName(),amount,count); return amount; } else { return 0; } }}”C:\Program Files\Java\jdk1.8.0_161\bin\java.exe” -javaagent:E:\install\IntelliJIDEA2018.3.6\lib\idea_rt.jar=55326:E:\install\IntelliJIDEA2018.3.6\bin -Dfile.encoding=UTF-8 -classpath “C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\javaEE\Sort\out\production\ThreadTest” ThreadTest03窗口 8 卖了 4 张,剩余 1996 张票窗口 198 卖了 3 张,剩余 1993 张票窗口 195 卖了 4 张,剩余 1989 张票窗口 187 卖了 4 张,剩余 1985 张票窗口 176 卖了 3 张,剩余 1982 张票窗口 192 卖了 3 张,剩余 1979 张票窗口 197 卖了 4 张,剩余 1975 张票窗口 193 卖了 5 张,剩余 1970 张票窗口 179 卖了 5 张,剩余 1965 张票窗口 180 卖了 2 张,剩余 1963 张票窗口 189 卖了 1 张,剩余 1962 张票窗口 183 卖了 5 张,剩余 1957 张票窗口 185 卖了 4 张,剩余 1953 张票窗口 196 卖了 3 张,剩余 1950 张票窗口 181 卖了 4 张,剩余 1946 张票窗口 173 卖了 1 张,剩余 1945 张票窗口 199 卖了 4 张,剩余 1941 张票窗口 191 卖了 1 张,剩余 1940 张票窗口 164 卖了 4 张,剩余 1936 张票窗口 177 卖了 2 张,剩余 1934 张票窗口 167 卖了 4 张,剩余 1930 张票窗口 161 卖了 1 张,剩余 1929 张票窗口 158 卖了 1 张,剩余 1928 张票窗口 165 卖了 3 张,剩余 1925 张票窗口 194 卖了 1 张,剩余 1924 张票窗口 190 卖了 1 张,剩余 1923 张票窗口 186 卖了 4 张,剩余 1919 张票窗口 170 卖了 4 张,剩余 1915 张票窗口 188 卖了 3 张,剩余 1912 张票窗口 162 卖了 4 张,剩余 1908 张票窗口 156 卖了 1 张,剩余 1907 张票窗口 171 卖了 3 张,剩余 1904 张票窗口 163 卖了 1 张,剩余 1903 张票窗口 153 卖了 1 张,剩余 1902 张票窗口 150 卖了 3 张,剩余 1899 张票窗口 149 卖了 4 张,剩余 1895 张票窗口 146 卖了 3 张,剩余 1892 张票窗口 184 卖了 5 张,剩余 1887 张票窗口 182 卖了 1 张,剩余 1886 张票窗口 178 卖了 4 张,剩余 1882 张票窗口 175 卖了 5 张,剩余 1877 张票窗口 172 卖了 5 张,剩余 1872 张票窗口 168 卖了 2 张,剩余 1870 张票窗口 159 卖了 1 张,剩余 1869 张票窗口 152 卖了 2 张,剩余 1867 张票窗口 136 卖了 5 张,剩余 1862 张票窗口 155 卖了 4 张,剩余 1858 张票窗口 145 卖了 1 张,剩余 1857 张票窗口 174 卖了 1 张,剩余 1856 张票窗口 166 卖了 5 张,剩余 1851 张票窗口 169 卖了 5 张,剩余 1846 张票窗口 154 卖了 3 张,剩余 1843 张票窗口 134 卖了 1 张,剩余 1842 张票窗口 160 卖了 1 张,剩余 1841 张票窗口 133 卖了 1 张,剩余 1840 张票窗口 148 卖了 4 张,剩余 1836 张票窗口 147 卖了 1 张,剩余 1835 张票窗口 130 卖了 5 张,剩余 1830 张票窗口 143 卖了 3 张,剩余 1827 张票窗口 132 卖了 2 张,剩余 1825 张票窗口 125 卖了 4 张,剩余 1821 张票窗口 144 卖了 2 张,剩余 1819 张票窗口 140 卖了 1 张,剩余 1818 张票窗口 139 卖了 5 张,剩余 1813 张票窗口 119 卖了 1 张,剩余 1812 张票窗口 123 卖了 5 张,剩余 1807 张票窗口 157 卖了 1 张,剩余 1806 张票窗口 137 卖了 4 张,剩余 1802 张票窗口 117 卖了 1 张,剩余 1801 张票窗口 121 卖了 1 张,剩余 1800 张票窗口 129 卖了 2 张,剩余 1798 张票窗口 114 卖了 1 张,剩余 1797 张票窗口 141 卖了 5 张,剩余 1792 张票窗口 142 卖了 2 张,剩余 1790 张票窗口 105 卖了 2 张,剩余 1788 张票窗口 135 卖了 1 张,剩余 1787 张票窗口 151 卖了 3 张,剩余 1784 张票窗口 116 卖了 2 张,剩余 1782 张票窗口 120 卖了 1 张,剩余 1781 张票窗口 113 卖了 2 张,剩余 1779 张票窗口 108 卖了 3 张,剩余 1776 张票窗口 111 卖了 4 张,剩余 1772 张票窗口 131 卖了 4 张,剩余 1768 张票窗口 102 卖了 3 张,剩余 1765 张票窗口 138 卖了 1 张,剩余 1764 张票窗口 110 卖了 5 张,剩余 1759 张票窗口 101 卖了 1 张,剩余 1758 张票窗口 97 卖了 2 张,剩余 1756 张票窗口 96 卖了 2 张,剩余 1754 张票窗口 128 卖了 1 张,剩余 1753 张票窗口 127 卖了 2 张,剩余 1751 张票窗口 112 卖了 1 张,剩余 1750 张票窗口 124 卖了 1 张,剩余 1749 张票窗口 107 卖了 2 张,剩余 1747 张票窗口 99 卖了 2 张,剩余 1745 张票窗口 126 卖了 1 张,剩余 1744 张票窗口 118 卖了 1 张,剩余 1743 张票窗口 90 卖了 3 张,剩余 1740 张票窗口 82 卖了 3 张,剩余 1737 张票窗口 93 卖了 5 张,剩余 1732 张票窗口 81 卖了 4 张,剩余 1728 张票窗口 122 卖了 1 张,剩余 1727 张票窗口 98 卖了 5 张,剩余 1722 张票窗口 104 卖了 1 张,剩余 1721 张票窗口 115 卖了 2 张,剩余 1719 张票窗口 103 卖了 3 张,剩余 1716 张票窗口 80 卖了 3 张,剩余 1713 张票窗口 79 卖了 1 张,剩余 1712 张票窗口 92 卖了 3 张,剩余 1709 张票窗口 109 卖了 5 张,剩余 1704 张票窗口 106 卖了 5 张,剩余 1699 张票窗口 94 卖了 2 张,剩余 1697 张票窗口 84 卖了 4 张,剩余 1693 张票窗口 100 卖了 3 张,剩余 1690 张票窗口 63 卖了 2 张,剩余 1688 张票窗口 68 卖了 5 张,剩余 1683 张票窗口 76 卖了 4 张,剩余 1679 张票窗口 69 卖了 5 张,剩余 1674 张票窗口 86 卖了 3 张,剩余 1671 张票窗口 62 卖了 4 张,剩余 1667 张票窗口 66 卖了 3 张,剩余 1664 张票窗口 50 卖了 3 张,剩余 1661 张票窗口 77 卖了 1 张,剩余 1660 张票窗口 88 卖了 5 张,剩余 1655 张票窗口 53 卖了 2 张,剩余 1653 张票窗口 95 卖了 1 张,剩余 1652 张票窗口 91 卖了 1 张,剩余 1651 张票窗口 59 卖了 5 张,剩余 1646 张票窗口 72 卖了 2 张,剩余 1644 张票窗口 71 卖了 2 张,剩余 1642 张票窗口 47 卖了 1 张,剩余 1641 张票窗口 61 卖了 3 张,剩余 1638 张票窗口 57 卖了 1 张,剩余 1637 张票窗口 74 卖了 1 张,剩余 1636 张票窗口 73 卖了 4 张,剩余 1632 张票窗口 70 卖了 5 张,剩余 1627 张票窗口 75 卖了 2 张,剩余 1625 张票窗口 39 卖了 1 张,剩余 1624 张票窗口 60 卖了 3 张,剩余 1621 张票窗口 67 卖了 2 张,剩余 1619 张票窗口 44 卖了 4 张,剩余 1615 张票窗口 24 卖了 5 张,剩余 1610 张票窗口 28 卖了 1 张,剩余 1609 张票窗口 32 卖了 1 张,剩余 1608 张票窗口 87 卖了 5 张,剩余 1603 张票窗口 83 卖了 3 张,剩余 1600 张票窗口 38 卖了 4 张,剩余 1596 张票窗口 65 卖了 4 张,剩余 1592 张票窗口 42 卖了 5 张,剩余 1587 张票窗口 33 卖了 1 张,剩余 1586 张票窗口 54 卖了 2 张,剩余 1584 张票窗口 85 卖了 1 张,剩余 1583 张票窗口 89 卖了 1 张,剩余 1582 张票窗口 78 卖了 2 张,剩余 1580 张票窗口 40 卖了 5 张,剩余 1575 张票窗口 35 卖了 2 张,剩余 1573 张票窗口 23 卖了 1 张,剩余 1572 张票窗口 27 卖了 3 张,剩余 1569 张票窗口 31 卖了 2 张,剩余 1567 张票窗口 52 卖了 5 张,剩余 1562 张票窗口 48 卖了 5 张,剩余 1557 张票窗口 41 卖了 4 张,剩余 1553 张票窗口 45 卖了 4 张,剩余 1549 张票窗口 36 卖了 5 张,剩余 1544 张票窗口 25 卖了 3 张,剩余 1541 张票窗口 46 卖了 3 张,剩余 1538 张票窗口 43 卖了 2 张,剩余 1536 张票窗口 12 卖了 2 张,剩余 1534 张票窗口 51 卖了 5 张,剩余 1529 张票窗口 16 卖了 3 张,剩余 1526 张票窗口 30 卖了 5 张,剩余 1521 张票窗口 49 卖了 1 张,剩余 1520 张票窗口 64 卖了 5 张,剩余 1515 张票窗口 56 卖了 1 张,剩余 1514 张票窗口 58 卖了 1 张,剩余 1513 张票窗口 55 卖了 4 张,剩余 1509 张票窗口 14 卖了 1 张,剩余 1508 张票窗口 7 卖了 3 张,剩余 1505 张票窗口 4 卖了 5 张,剩余 1500 张票窗口 29 卖了 4 张,剩余 1496 张票窗口 22 卖了 3 张,剩余 1493 张票窗口 37 卖了 3 张,剩余 1490 张票窗口 34 卖了 5 张,剩余 1485 张票窗口 26 卖了 2 张,剩余 1483 张票窗口 19 卖了 4 张,剩余 1479 张票窗口 20 卖了 4 张,剩余 1475 张票窗口 15 卖了 5 张,剩余 1470 张票窗口 21 卖了 3 张,剩余 1467 张票窗口 18 卖了 5 张,剩余 1462 张票窗口 11 卖了 2 张,剩余 1460 张票窗口 17 卖了 3 张,剩余 1457 张票窗口 13 卖了 1 张,剩余 1456 张票窗口 2 卖了 1 张,剩余 1455 张票窗口 6 卖了 3 张,剩余 1452 张票窗口 3 卖了 3 张,剩余 1449 张票窗口 10 卖了 5 张,剩余 1444 张票窗口 9 卖了 5 张,剩余 1439 张票窗口 5 卖了 5 张,剩余 1434 张票窗口 1 卖了 2 张,剩余 1432 张票一共卖了 :568剩余票数1432

片的时光如浮云般流过,我们的青春单薄的穿梭在蓝天之上。

多线程数据共享之卖票问题

相关文章:

你感兴趣的文章:

标签云: