多线程---线程安全

2/22/2017来源:ASP.NET技巧人气:982

六.多线程安全问题 导致安全问题的出现的原因:
 1.多个线程访问出现延迟。
 2.线程随机性。 换言之:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误 解决方法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行的过程中,其他线程不可以参与执行。

3.七、多线程安全问题的解决方法 1.同步代码块synchronized(对象){ //需要被同步的代码(共享数据需要同步,其他不需要) } 对象如同锁,持有锁的线程可以在同步中执行 没有持有锁的线程即便获取cpu执行权,他也进不去,因为没有获取锁 同步的前提: 1.必须要有两个或者两个以上的线程 2.必须是多个线程使用同一个锁 必须保证同步中只能有一个线程在运行好处: 1.解决了多线程的安全问题 2.弊端:多个线程需要判断锁,较为消耗资源

函数使用的锁是this 函数用synchronized就是同步函数 等同于同步代码块 如果同步函数被静态修饰后,使用的锁不是this 因为静态方法中不可以定义this静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码对象, 即类名.class 该对象的类型是Class 静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class 换言之:静态同步方法中的锁对象是 类名.class

package test.thread; /* * 卖票 */ public class SellTicket { public static void main(String[] args) { TicketRunable tr = new TicketRunable(); Thread t1 = new Thread(tr, "窗口一"); Thread t2 = new Thread(tr, "窗口二"); Thread t3 = new Thread(tr, "窗口三"); t1.start(); t2.start(); t3.start(); } } class TicketRunable implements Runnable { int i = 100; @Override public void run() { while (true) { synchronized ("锁") { if (i > 0) { System.out.PRintln(Thread.currentThread().getName() + "卖出了第" + i + "张票"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } i--; } else { System.out.println("票卖完了"); break; } } } } }