------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1. 通过实例解说多线程安全:
class Ticket implements Runnable//extends Thread
{
private static int tick = 100;
public void run()
{
while(true)
{
if(tick>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"sale : "+ tick--);
}
}
}
}
class
{
public static void main(String[] args)
{
Ticker 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();
}
}
通过分析,发现,打印出0,-1,-2等错票。多线程的运行出现了安全问题。
问题的原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参加与进来执行,导致共享数据的错误。
解决办法:
对多条操作共享数据的语句,只能让一个线程都执行完,在执行的过程中,其它线程不可以参与执行。
Java对于多线程的安全问题提供了专业的解决方式:就是同步代码块。
synchronized(对象)
{
需要被同步的代码
}
如:
class Ticket implements Runnable//extends Thread
{
private static int tick = 100;
Object obj = new Object();//建立一个超类对象
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"sale : "+ tick--);
}
}
}
}
}
2. 对象如同锁,持有锁的线程可以在同步中执行,没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
3. 同步的前提:
1. 必须要有两个或者两个以上的线程。
2. 必须多个线程使用同一个锁。
必须保证同步中只有一个线程在运行。
4. 好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源。
5同步函数用的哪一个锁呢?
函数需要被对象调用,那么函数都有一个所属对象引用,就是this,所以同步函数使用的锁是this。
6. 如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不再是this,因为静态方法中也不可以定义this。静态进内存是,内存中没有本类对象,但是一定有该类对象的字节码文件对象,类名.class 该对象的类型是class。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象:类名.class
7. 多线程在单例中的应用:
a:懒汉式和饿汉式的区别:
懒汉式用于延迟加载,懒汉式延迟加载有没有问题:多线程使用时会出现安全问题,可以加同步解决,用同步函数和同步代码块都行,但稍微有点低效,用双重判断能解决效率问题,加同步时实用的锁是:该类所属的字节码对象。
例子:
class Single
{
private static Single = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
{
s = new Single();
}
}
}
return s;
}
}
8. 学习心得体会
系统了解同步代码块和锁的区别,具体分析要用到哪一种,了解用的好处:解决了多线程的安全问题;
学会应用单例,把把单例应用的自己平常的代码中
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------