多线程的安全问题。
安全问题产生的原因:
1,多个线程在操作共享数据。
2,操作共享数据的代码有多条。
一个线程在执行多条操作共享数据的过程中,其他线程参数与了运算,这时就会发生安全问题。
想要分析是否安全问题:
依据:线程任务中有没有共享数据,该数据是否被多条语句操作啊。
解决方案:只要保证一个线程在执行多条操作共享数据的语句时,其他线程不能参与运算即可。
当该线程都执行完后,其他线程才可以执行这些语句。
代码表现:java中给我们提供具体的解决语句。
那就是同步代码块。
格式:
synchronized(对象)//对象可以是任意的对象。
{
需要被同步的语句。
}
同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。
同步的好处:解决多线程的安全问题。
同步的弊端:会降低性能。
一种现象:出现了多线程安全问题,为了解决,加上同步,发现,问题依旧。
怎么办?
同步的前提:
必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义。
必须要保证多个线程在同步中使用的是同一个锁。
必须保证多个线程使用的锁是同一个。
这时才成为多个线程被同步了。
*/
class Ticket implements Runnable
{
private int num = 200;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(num>0)
{
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
}
}
}
}
}
class ThreadSynDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
//创建线程对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
} |
|