java线程的同步

来源:互联网 发布:免费速读训练软件 编辑:程序博客网 时间:2024/05/16 09:15

线程的使用,让程序的执行更为灵活,给我们的生活提供的更多的方便,尤其是服务器,已经游戏中使用的大量多线程,但是任何东西都是有两面性的,由于我们不可以对线程的执行几率进行控制,所以有存在很多的安全问题。那么怎么才能使线程同步呢

java提供的机制是使用synchronized关键字,背后使用了封锁来实现资源的互斥访问

synchronized的第一种用法,同步代码块

</pre><pre name="code" class="java">package cn.java.thread;class Ticket2 extends Thread{ public static int ticket =1000;public void run(){while(true){synchronized ("")/*设置一个锁,只有一个线程可以用这个锁,在这个锁的范围类,只有把这个锁里边的代码执行完毕,才会自动释放,其他线程才可以来抢占这个锁,若果这个锁被一个线程占用,并且其他还没有释放这个锁,其他线程就没法来占用,里边的参数 object可以为如何一个对象,“”也是一个对象,并放是放在数据区的,所以只有一个,所以new出实例时只会创建一个,既两个线程锁定的对象是同一个*/{try{Thread.sleep(1000);}catch(Exception e){}if(ticket>0) {System.out.println(Thread.currentThread().getName()+ticket--+"票");}elsebreak;}}}}public class Test_synchro_2 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTicket2 bb =new Ticket2();Ticket2 cc =new Ticket2();bb.setName("窗口1卖出第:");cc.setName("窗口2卖出第:");bb.start();cc.start();}}

这是一个实现简单的卖票程序,有两个线程会对其操作,那么就有问题了,就是一个线程在执行操作到一半时,cpu被抢了,另一个线程有来执行,就很可能出现卖同一张票,或者卖不存在的票,那么我们可以用同步代码块让对票操作的相代码是锁起来,只要一个线程没有执行完锁里边的代码,就不会释放多代码块的所有权,这样即使中间断开后,另一个线程来执行,发现锁还没有解开,就没办法去执行。


第二种用法  同步方法

public synchronized void produce()
{
if(!flag)
{
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在生产第"+(++product)+"个");
flag = true;
if(product==1)
{
this.notify();
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

这里的锁定的对象,是this也就是说,谁调用我就锁定谁。如果是静态方法,那么锁定的类的实例,在类加载的使用就锁定这个类的实例


如果要实现同步关键就看锁定的对象是不是同一个

0 0
原创粉丝点击