java 同步锁方法
方法一:动态同步锁
class Demo_thread implements Runnable{
public static int sum = 0;
public synchronized void add(){//同步锁,为动态方法
for(int i=0;i<5000;i++){
sum = sum + 1;
}
}
public void run(){
add();
}
}
动态同步锁适用于Runnable类中不适用与Thread类,因为其锁的对象为当前实例对象,一个Thread类只能跑一条线程,每条线程是不同的对象,所以同步锁将不起作用。
方法二:静态同步锁
class Demo_thread2 extends Thread{
public static int sum = 0;
public static synchronized void add(){//为静态方法
for(int i=0;i<5000;i++){
sum = sum + 1;
}
}
public void run(){
add();
}
}
静态同步锁可以用于Thread类,因为静态方法在内存中只有一个实例,不会随着new新的对象而再创建实例。
方法三:代码块同步锁
class Demo_thread implements Runnable{
public static int sum = 0;
public void add(){
for(int i=0;i<5000;i++){
synchronized(this){//使用代码段同步锁,可以选择同步锁定
sum = sum + 1; //一段代码,而不必要锁定整个方法
}
}
}
public void run(){
add();
}
}
代码块同步锁同样分为动态和静态,区分跟方法同步锁一样,定义动静态代码块同步锁的方法的区别是synchronized()跟的参数是动态还是静态,注意其接收的参数应该是一个实例对象,上面的方法中的this为传递本身,属于动态方法。下面为定义一段动态代码块同步锁的方法:
class Object{
//定义一个空类来给synchronized传参
}
class Demo_thread2 extends Thread{
public static int sum = 0;
public static Object lock = new Object();//实例化一个静态对象
public void add(){
for(int i=0;i<5000;i++){
synchronized(lock){
sum = sum + 1;
}
}
}
public void run(){
add();
}
}
方法四:使用lock方法
import java.util.concurrent.locks.ReentrantLock;
class Demo_thread3 implements Runnable{
public static int sum = 0;
private final ReentrantLock lock=new ReentrantLock();//创建ReentrantLock k对象
public void add(){
lock.lock();//获取锁 如果该锁被另一个线程保持,则出于线程调度的目的,
for(int i=0;i<5000;i++){//禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态
sum = sum + 1;
}
lock.unlock();
}
public void run(){
add();
}
}
因为每次调用线程的时候都会创建一个新的lock对象,所以同理当在Thread类中使用lock时把ReentrantLock的修饰语变成static 静态就行了。
java 同步锁方法的更多相关文章
- java同步锁实现方法
1.synchronized关键字修饰 当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态 synchronized关键字也可以修饰静态方法,此 ...
- Java同步锁——lock与synchronized 的区别【转】
在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...
- Java同步锁全息详解
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- Java同步锁何时释放?
在测试java多线程中有关 “生产者和消费者” 这个经典问题的时候,写代码测试的时候,思考到一些问题(所以还是要动手,实践才能储真知啊), synchronize 同步锁何时释放,何时获得?重新获得锁 ...
- java同步锁的正确使用
同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同 ...
- JAVA同步锁机制 wait() notify() notifyAll()
wait() notify() notifyAll() 这3个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块中使用. wait() 必须在synchronized函数或 ...
- Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用
首先了解什么是多线程与进程 进程:是一个执行过程,动态的概念 --->会分配内存线程:是进程的一个单元,线程是系统最小的执行单元 详解: http://blog.csdn.net/luoweif ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java多线程同步的方法
一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...
随机推荐
- C# SQL优化 及 Linq 分页
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- linux:什么是linux
1>.linux是一套作业系统(linux就是核心与呼叫这两层),每一种作业系统都是在他专门的硬体机器上面运行的:linux是一个Open Source的作业系统,具有可移植性 2>.li ...
- javax.xml.ws.webserviceexception class do not have a property of the name
我是用wsimport生成webservice 的客户端,放到工程里,调用,出现这个异常, 后来发现,是没有把package-info.java这个文件一起放到包里的缘故 解决: 连同package- ...
- JAVA类加载机制详解
“代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是变成语言发展的一大步”,这句话出自<深入理解JAVA虚拟机>一书,后面关于jvm的系列文章主要都是参考这本书. JAV ...
- Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台的组成 我们的平台由3部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台 ...
- Leetcode: Flatten Nested List Iterator
Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...
- sql server create foreign key
in table design view(right click table and choose design), right click on a column, and select 'rela ...
- hduoj 4707 Pet 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4707 Pet Time Limit: 4000/2000 MS (Java/Others) Memory ...
- VS2010程序打包
今天,小白就来给各位做个打包的新手教程,此文仅是为了记录自己的学习过程与方便其他初次接触的打包的朋友们总结一下,希望大家能够受用.废话不多说,下面我们就来讲解下打包工程.首先,在项目中添加一个安装项目 ...
- 当android studio一直显示gradle compile dependency
出现这种情况,是被墙的问题,我的解决办法是这样的: 打开file---->setting,然后搜索gradle,把offline勾上,然后点击apply以及ok,就可以了. 有时候它会关闭,只需 ...