一、常见问题
从小的方面讲, 并发编程最常见的问题就是可见性、原子性和有序性问题。
从大的方面讲, 并发编程最常见的问题就是安全性问题、活跃性问题和性能问题。
下面主要从微观上分析问题。
二、可见性问题
可见性:一个线程对共享变量的修改,另外一个线程能够立马看到,这个称之为可见性。知道了可见性那么你就知道可见性问题了.
可见性问题:一个线程对共享变量的修改,但另一个线程感知不到其修改值的操作,读取的还是原来的值,这样会引起数据紊乱。
场景案例分析:以我们现实生活中为例,比如电影院卖票系统,假设一个电影院的座位有10000张,此时有两个影迷(同时)过来分别各买了5000张电影票,那么它还剩多少余票呢?下面我们看下代码实现:
public classVisibilityProblemTest {/*** 电影票总数*/
private int movieTicketAmount = 10000;/*** 售票*/
public void saleTicket(intn) {/*** 为了让问题能够明显一点,使用减1的操作,重复n次*/
int i = 0;while (i++
movieTicketAmount-= 1;
}
}/*** 返回剩余电影票
*@returnint*/
public intgetMovieTicketAmount() {returnmovieTicketAmount;
}public static void main(String[] args) throwsInterruptedException {final VisibilityProblemTest ticket = newVisibilityProblemTest();//假设现在有两个用户分别购买5000张电影票
Thread user1 = new Thread(() -> ticket.saleTicket(5000));
Thread user2= new Thread(() -> ticket.saleTicket(5000));
user1.start();
user2.start();//等待用户购买完成
user1.join();
user2.join();//售了10000张电影票后查验余数,理应还剩0张
System.out.println(ticket.getMovieTicketAmount());
Assert.assertEquals(ticket.getMovieTicketAmount(),0);
}
}
大家应该都猜到了,最终的余票不一定为0,有可能会大于0。因为其存在数据可见性问