回答

收藏

线 程 同 步、线程的死锁问题(线程间同步)

知识点 知识点 30 人阅读 | 0 人回复 | 2023-01-19

帖子摘要:线程同步模拟售票程序出现问题            当多个线程同时访问共享数据时产生无序、重复、超额售票等多线程安全问题解决将多个线程需要访问的共享数据包装起来视为一个整体确保一次只有一个线程执行流访......
/ h, x" y; b  q% h0 \( O3 I& T+ f  x; W' I0 \8 I+ J
大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“线 程 同 步、线程的死锁问题”2 E3 ]5 I7 x4 q5 X1 K. m" H! }- s' L: F  @
( F: ]+ I# k. W% s2 R; c. L* b
$ D5 e* S2 ?$ o* {
        $ K. D6 W3 p9 h5 U: c$ b
               
4 Y# l4 [; ~! H  P                    线程同步
3 ~8 e& ~# R1 T( L6 m5 |" G$ A模拟售票程序出现问题8 ?5 o& y$ g% W3 B- F7 y) t
            当多个线程同时访问共享数据时产生无序、重复、超额售票等多线程安全问题) E3 d3 c" t1 x9 ^" k- c6 w6 Q% }
解决将多个线程需要访问的共享数据包装起来视为一个整体确保一次只有一个线程执行流访问共享数据. A5 E  G& F4 @: C  R
Java为上述问题提供了相应的解决办法
2 ~6 s: o- D3 E# R    1、同步代码块6 m' ]. ?7 n9 X. r2 E- L, A
         synchronized(同步监视器){5 W& K3 v: w8 L5 f  N! s  C) e' T  k
            //多个线程需要访问的共享数据6 l3 Q5 T6 {( P4 i% n9 x5 ~0 I
         }6 j1 `  l: h1 d% V! i! I7 X
         同步监视器俗称“锁” 可以使用任意类型的对象充当。但是必须保证多个线程持有 同一把锁同一个对象' A. _/ T8 F) X" g
    2、同步方法% M/ t2 {7 D, ?& H
    3、同步锁 Lock) Y8 _  [/ |7 m5 m3 O4 O" M

8 |$ L2 X( O' t/ T, T" `5 u
  1. package Thread;
  2. public class TicketWindow2 implements Runnable{   g0 ^) v1 E; a* [
  3.     int tick=100; * p7 H/ O! Z; V% d
  4.     Object obj=new Object(); ( k* k  S+ \) |2 X6 {
  5.     @Override 2 J, b3 j% c* j) K9 s
  6.     public void run() { $ S5 z" Q) _* ]8 k1 j
  7.         while (true){
  8.             synchronized (obj){
  9.                 if (tick>0){
  10.                     try {
  11.                         Thread.sleep(100); 2 R' B) `; i6 C0 }
  12.                     } catch (InterruptedException e) { / j+ e+ @9 s8 Y6 J; u7 a
  13.                     }
  14.                     System.out.println(Thread.currentThread().getName()+"完成售票剩余票数"+ --tick);
  15.                 }
  16.             } ' @* C4 C/ o  J# E
  17.         }
  18.     } 9 ], B1 o0 |8 g8 {- j5 p4 T
  19. } 1 Z9 A% a$ x+ B* Q
复制代码
: w5 t* l5 S7 m8 {% g
  1. package Thread;
  2. public class TicketWindowTest2 {
  3.     public static void main(String[] args) {
  4.         TicketWindow2 tw2=new TicketWindow2(); ( c- }6 _' m6 L6 y) U7 ?$ A- y: P
  5.         Thread t1=new Thread(tw2,"一号窗口"); , `5 G% d. a7 q5 ^% h! U2 ]) ]
  6.         t1.start(); 5 l  @2 z' t$ L
  7.         Thread t2=new Thread(tw2,"二号窗口"); 3 [, _: m8 |$ _/ D8 S0 y: a( p$ `0 T
  8.         t2.start();   E; W7 j5 A* a$ U0 \
  9.         Thread t3=new Thread(tw2,"三号窗口");
  10.         t3.start(); 0 f' H- l) `; i2 H7 J* q2 e7 D
  11.     } ' Z& B7 _8 x7 k4 J3 B* F% v) g5 w% _
  12. }
复制代码
- K, a) M+ w1 O/ N7 t" l0 ?$ z7 s, x
86b6f2fc82bd426283daccf7c1504f74.png (78.28 KB, 下载次数: 0, 售价: 6 金钱)
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则