有关synchronized同步笔记

synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。

注意:

A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。

B.每个对象只有一个锁(lock)与之相关联。

C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

1.对象实例的锁

class Test{

    public synchronized void f1(){

    //do something here

    }

    public void f2(){

    synchronized(this){

    //do something here

    }

    }

    }

上面的f1()和f2()效果一致, synchronized取得的锁都是Test某个实列(this)的锁.比如: Test t = new Test();线程A调用t.f2()时, 线程B无法进入t.f1(),直到t.f2()结束.

作用:多线程中访问Test的同一个实例的同步方法时会进行同步.

2.class的锁

class Test{

    final static Object o= new Object();

    public static synchronized void f1(){

    //do something here

    }

    public static void f2(){

    synchronized(Test.class){

    //do something here

    }

    }

    public static void f3(){

    try {

    synchronized (Class.forName("Test")) {

    //do something here

    }

    }

    catch (ClassNotFoundException ex) {

    }

    }

    public static void g(){

    synchronized(o){

    //do something here

    }

    }

    }

上面f1(),f2(),f3(),g()效果一致

f1(),f2(),f3()中synchronized取得的锁都是Test.class的锁.

g()是自己产生一个对象o,利用o的锁做同步

作用:多线程中访问此类或此类任一个实例的同步方法时都会同步. singleton模式lazily initializing属于此类.

3.static method

class Test{

    private static int v = 0;

    public static void f1(){

    //do something, 但函数中没用用到v

    }

    public synchronized static void f2(){

    //do something, 函数中对v进行了读/写.

    }

    }

多线程中使用Test的某个实列时,

(1)f1()是线程安全的,不需要同步

(2)f2()这个静态方法中使用了函数外静态变量,所以需要同步.

时间: 2024-11-15 06:31:22

有关synchronized同步笔记的相关文章

synchronized同步块和volatile同步变量

阅读目录 synchronized同步块 volatile同步变量 Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错. 回到顶部 synchronized同步块 Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作.所有其他等待进

四、java多线程核心技术——synchronized同步方法与synchronized同步快

一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变量为线程安全 public void addI(String username) { try { int num = 0; \\方法内的变量为线程安全 if (username.equals("a")) { num = 100; System.out.println("a set

synchronized同步记录

记录原因:在开发中查看了一些优秀的图片下载框架,经常用到Synchronized同步,由于自己对同步有点模糊了,特此记录,方便下次查阅! synchronized分为同步方法和同步代码块. synchronized锁定的内容可以是具体的对象也可以是当前类的所有对象 synchronized可以有static变量锁和非static变量锁 1.同步方法 /** * 对象锁<同步方法> 锁定的对象是具体的类对象 多个线程可以访问不同该对象的方法 但是对于同一个对象一次只能访问一次 */ public

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

java:synchronized 同步代码块

synchronized:利用上锁实现数据同步,避免多线程操作的情况下,数据出现异常. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行. 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 在代码块前加上 synchronized关键字,则此代码块就成为同步代码块, 格式: synchronized(同步对象){ 需要同步的代码: } class MyThread implements Runnab

Java多线程synchronized同步

非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程不安全.下面以实例说明 1 public class HasSelfNum { 2 private int num = 0; 3 public void add(String name) { 4 try { 5 if (name.equals("a")) { 6 num = 100; 7

java多线程(三)——锁机制synchronized(同步语句块)

用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解决. 一.用同步代码块解决同步方法的弊端 Task类 1 package com.weishiyao.learn.day4.testSynchorized.ep2; 2 3 public class Task { 4 5 private String getData1; 6 private Stri

synchronized同步代码块锁释放

今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637  问题线程的内容. "schedulerJob-t-291" #314 daemon prio=5 os_prio=0 tid=0x00007f7d64844800 nid=0x3d5 runnable [0x00007f7d3a107000] java.lang.Thread.State: RUNNABLE at

2.synchronized同步锁

原文链接:http://blog.csdn.net/zteny/article/details/54863391 简介 synchronized是Java语言的一个关键字,用来修饰一个方法或者代码块,使得目标达到线程同步的目的. 当我们希望某个方法或者代码块,同一时间只能有一个线程能够执行,即是同一时间只有一个线程能够进入该方法或者代码块,其它线程将会被阻塞直接原线程执行结束,此时我们使用该关键字. 用法 由上面的简介可以可得synchronized的两种用法,如下: public synchr