方法一:动态同步锁

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 同步锁方法的更多相关文章

  1. java同步锁实现方法

    1.synchronized关键字修饰 当用此关键字修饰方法时,     内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态 synchronized关键字也可以修饰静态方法,此 ...

  2. Java同步锁——lock与synchronized 的区别【转】

    在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchroni ...

  3. Java同步锁全息详解

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  4. Java同步锁何时释放?

    在测试java多线程中有关 “生产者和消费者” 这个经典问题的时候,写代码测试的时候,思考到一些问题(所以还是要动手,实践才能储真知啊), synchronize 同步锁何时释放,何时获得?重新获得锁 ...

  5. java同步锁的正确使用

    同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同 ...

  6. JAVA同步锁机制 wait() notify() notifyAll()

    wait() notify() notifyAll() 这3个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块中使用. wait() 必须在synchronized函数或 ...

  7. Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用

    首先了解什么是多线程与进程 进程:是一个执行过程,动态的概念 --->会分配内存线程:是进程的一个单元,线程是系统最小的执行单元 详解: http://blog.csdn.net/luoweif ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. Java多线程同步的方法

    一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...

随机推荐

  1. Servlet加载器的实验

    今天,看了张孝祥老师的类加载器的一个高级实验分析的教程,有点受益匪浅. 新建servlet工程,在Servlet类中 package com.sinosoft.servelt; import java ...

  2. PHYLIP linux安装

    PHYLIP的安装: http://download.chinaunix.net/download.php?id=29483&ResourceID=8135下载 gunzip phylip-3 ...

  3. F面经:painting house

    There are a row of houses, each house can be painted with three colors red, blue and green. The cost ...

  4. UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)

    题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的 ...

  5. cpp quiz

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream&g ...

  6. BeanFactory

            Spring容器,最基本的接口就是BeanFactory 负责创建,配置,管理bean 它有一个子接口ApplicationContext并将功能扩展.         理论上bean ...

  7. paper 23 :Kullback–Leibler divergence KL散度(2)

    Kullback–Leibler divergence KL散度 In probability theory and information theory, the Kullback–Leibler ...

  8. yii2添加自定义字段

    在模型model文件中,添加 public $attributes;即可,$attributes 为要添加的新字段

  9. Watir资源列表【转】

    Watir简介 "Watir" (发音与 water相近) 全写是 "Web Application Testing in Ruby".Watir是一款用Rub ...

  10. Robotium Recorder的初试

    一.安装 资料来自官方 Prerequisites: Install the Java JDK. Install the Android SDK. The ADT bundle with Eclips ...