线程同步锁

线程又称之为“轻量级进程”,和进程一样拥有独立的执行控制,由操作系统负责调度。区别在于其没有独立的存储空间,而是和所属进程中的其他线程共享一个存储空间,这使得线程间的通信较进程简单。多线程程序,必须注意每个线程是否干扰了其他线程的工作。

因为每个线程都能读写相同的共享数据,由于数据共享会带来同步问题,进而会导致死锁的产生。由于多线程带来的性能改善是以可靠性为代价的,主要是因为有可能产生线程死锁。死锁是由于多个线程同时被阻塞,一个或者全部线程都在等待某个资源被释放,由于线程被无限期的阻塞,因此程序不能正常运行。简单的说是线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源,

导致死锁的根源是不适当的运用synchronized 关键字来管理线程对特定对象的访问,其作用就是确保某个时刻只是运行一个线程被允许执行特定的代码块,因此被允许执行的线程首先必须拥有对变量或者对象的排他性访问权,当线程访问对象的时候,线程就会给对象枷锁,而这个锁导致其他也要访问同一个对象的线程被阻塞,直至第一个线程释放加载在对象上的锁。

一个Java程序的多线程之间可以共享数据,当线程以异步方式来访问共享数据时,有时是不安全的或者是不合逻辑的,例如同一时刻一个线程在读取数据,另一个线程在处理数据,当处理数据的线程没有等到读取数据的线程读取完毕就处理数据,必然导致错误的处理结果,处理数据的线程不能处理当前还没有读取结束的数据,但是可以读取其他数据。

如果我们采用多线程同步控制机制,那么等到第一个线程读取数据后第2个线程才能处理该数据就会避免错误,可见线程同步是多线程编程当中的一个相当重要的技术。

线程同步是一个我们在处理线程的时候需要注意的问题,同步方法要用synchronized关键字修饰,修饰后,当一个线程使用这个方法后其他线程就需要等待这个方法的使用权,直到该线程完成该方法。

Java关键字synchronized同步对共享数据操作的方法,在一个对象中用synchronized生命的方法为同步方法,Java中有一个同步模型--监视器负责管理线程对对象中的同步方法的访问,赋予该对象唯一一把钥匙。当多个线程进入对象,只有取得该对象钥匙的线程才可以访问同步方法,其他线程在该对象中等待。直到该线程用wait()方法放弃这把钥匙,其他等待的线程抢占该钥匙,抢占到钥匙的线程才可以执行,而没有取得钥匙的线程仍然被阻塞到该对象中继续等待。

防止死锁,防止错误结果的发生,都需要线程同步机制来协调,利用关键字synchronized

关键字synchronized放置在访问控制权限之后  返回类型之前

感觉Jcretor这个软件的缺陷还是很大的

一个线程同步锁synchronized竟然运行失误

在命令行中运行完全没有问题

  public class ThreadSynchronized {			
    public static void main(String[] args){ 
  	    //启动两线程
          new cls1().start();        
          new cls2().start();
      }
  }
  //该线程类用来添加数字
  class cls1 extends Thread{	
  	com a = new com();	
     public void run(){
  	   int i=0 ;
  	   //增加数字
  	   while(i<=100) {
  		   a.synchM(this.getClass().getName(),i);
  		   i++;
  	   }     
     }
  }
  //该线程类用来减少数字
  class cls2 extends Thread{	
  	com b = new com();	
     public void run(){
  	   int i=100 ;
  	   //减去数字
  	   while(i>0) {
             b.synchN(this.getClass().getName(),i);
             i--;
  	   }     
     }
  }
  class com {
  	int i=0;
  	//同步方法
  	public synchronized void synchM(String obj,int i){
  		this.i=i;
  		System.out.println(obj + "访问,"+this.i);
     }
  	public synchronized void synchN(String obj,int j){
  		this.i=j;
  		System.out.println(obj + "访问,"+this.i);
    }
  }


 

所以当第一个线程将数加到100的时候第二个线程才可以执行数字的减法操作。

线程同步

线程同步的方式和机制:

同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。
“同”字从字面上容易理解为一起动作
其实不是,“同”字应是指协同、协助、互相配合。
如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。在Java里面,通过synchronized 进行同步的保证。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值