创建线程重要!!!
1、怎么做多线程题?口诀:线程 操作 资源类 ,高内聚低耦合(指的是操作)
不管会不会,先创建资源类,在资源类里封装对资源的操作,然后在创建多个线程,在操作这个资源类
2、多线程操作时候,就会产生线程安全问题,比如,之前提过的 i++ 就是线程不安全,JUC提供了安全解决措施,在 java.util.concurrent.locks包下,怎么做到线程安全,就是尽量做到原子性,atomic,i++之所以不是线程安全就是因为他是两部操作,在i加一,在赋值给i时容易产生线程不安全
3、怎么解决,使用lock类,或者是synchronized,但是lock是JUC提供的比synchronized更好的解决措施。
一、题目: 三个售票员 卖出 30张票
30张票就是资源类,卖出就是操作分装成了sale方法,其中里面用到了lock进行枷锁,不过Lock是接口,他有实现类例如下面的ReentrantLock
class Ticket
{
private int number = 30;
//Lock implementations provide more extensive
// locking operations than can be obtained using synchronized methods and statements.
private Lock lock = new ReentrantLock();// List list = new ArrayList();
public void sale()
{
lock.lock();
try
{
if(number > 0)
{
System.out.println(Thread.currentThread().getName()+"卖出第:"+(number--)+"\t"+"还剩下:"+number);
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
三个售票线程
public class SaleTicket
{
public static void main(String[] args)//main一切程序入口
{
Ticket ticket = new Ticket();
new Thread(() -> { for (int i = 1; i <=40; i++) ticket.sale(); },"A").start();
new Thread(() -> { for (int i = 1; i <=40; i++) ticket.sale(); },"B").start();
new Thread(() -> { for (int i = 1; i <=40; i++) ticket.sale(); },"C").start();
}
}