java多线程的同步与多线程锁介绍

线程的同步和锁的问题,我们先来看个例子,

下面的例子我们希望两个线程对m变量进行削减

 代码如下 复制代码

packagecom.javaer.thread;
 publicclassSysTestimplementsRunnable{
intm=10;

publicstaticvoidmain(String[]args){
SysTests1=newSysTest();
Threadt1=newThread(s1,"Thread-t1");
Threadt2=newThread(s1,"Thread-t2");
t1.start();
t2.start();

}
publicvoidreduce(){
m--;
}
@Override
publicvoidrun(){
while(m>0)
{
try{
Thread.sleep(1);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
this.reduce();
System.out.println(Thread.currentThread().getName()+"m的值:"+m);

}

}

}

Thread-t1m的值:8
Thread-t2m的值:8
Thread-t1m的值:7
Thread-t2m的值:6
Thread-t1m的值:5
Thread-t2m的值:4
Thread-t1m的值:3
Thread-t2m的值:2
Thread-t1m的值:0
Thread-t2m的值:0
两个线程不加控制的执行了reduce操作,于是出现了两个8的情况。

如果我们想线程按照一定的顺序执行,可以进行同步

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

这里我们对reduce操作进行锁

publicsynchronizedvoidreduce()
即可实现我们想要的。

java同步锁的原理

一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。

同步和锁的要点
1.只能同步方法,不能同步变量和类
2.不要同步所有方法,仅仅同步必要的方法
3.如果一个synchronized方法正在被一个线程调用,其他线程不能调用,进入等待状态,只要方法被释放。
4.线程休眠的时候,不会自动释放锁
5.同步会伤害效率,多线程的目的是并发,锁的目的是反并发。所以尽可能的缩小锁的范围。
6对于非静态字段中可更改的数据,通常使用非静态方法访问。
对于静态字段中可更改的数据,通常使用静态方法访问。

什么时候需要用同步
1.访问依赖的资源,比如都要从1个任务池里领取任务的时候。
2.多个线程都会修改同一个公共变量的时候

死锁

当一个占用了锁的线程,出了问题,比如崩溃。其他等待的线程全部发生阻塞,将发生死锁,一旦发生死锁,程序就死掉。

时间: 2024-09-29 22:21:50

java多线程的同步与多线程锁介绍的相关文章

大量数据转录的多线程和同步处理实现

项目中需要对两个不同格式的存储设备进行数据转录,因为数据量非常大,所以时间非常缓慢:解决 方案是使用ReaderWriterSlim类建立一个共享的同步数据,可以支持一个线程读取外部设备,向同步数据 写入:多个线程从同步数据中读取,转换格式,然后写入到本地设备. 本例中采用Queue<T>作为存放数据的集合,写入线程向它的尾部写入对象,读取线程从它的头 部获取对象. 需要注意的是,由于Queue会抛弃已处理的对象,所以在同步数据队列中无法验证数据对象的唯一性, 被写入的数据库需要去掉唯一约束,

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

Java多线程的同步示例及对象锁机制

java多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印. 先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这 是因为这里synchronized锁住的是this对象,即

多线程 java 同步 锁-java中多线程访问同步问题

问题描述 java中多线程访问同步问题 public class SyschronizedSample{ private int value; public synchronized int get(){ return value;} public synchronized void set(int value) { this.value=value; } } 以上的代码中,要使得访问value时具有线程安全,所以在set和get方法中都加了synchronized同步语句,如果只在set方法前

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

数据同步-java多线程数据库同步问题

问题描述 java多线程数据库同步问题 从一个数据库抽取数据 放到自己数据库里面 中间回走数据处理 和判断 用java代码实现目前找到好的方法 多线程操作效率还是很低 一点思路没有 有这方面大神吗 解决方案 可以利用数据库之间的同步来做呀!简单又实用 http://jingyan.baidu.com/article/19192ad815ad0ee53e5707c9.html

Java多线程及同步实现原理

一. 实现多线程 1. 虚假的多线程 例1: public class TestThread{ int i=0, j=0; public void go(int flag) { while(true) { try{ Thread.sleep(100); } catch(InterruptedException e) { System.out.println("Interrupted"); } if(flag==0) i++; System.out.println("i=&qu

.NET中多线程的同步资源访问

在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力.否则,在完全满足前一个请求之前,将无法处理每个新请求.然而,线程的异步特性意味着必须协调对资源(如文件句柄.网络连接和内存)的访问.否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作.结果将产生不可预知的数据损坏. 让我们先来看一片java的例子

【JAVA秒会技术之多线程】多线程java.util.concurrent详解

一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理. 线程:表示程序的执行流程,是CPU调度执行的基本单位:线程有自己的程序计数器.寄存器.堆栈和帧.同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源. 2.Java标准库提供了进程和线程相关的API,进程主要包括表示进程的jav