synchronized同步记录

记录原因:在开发中查看了一些优秀的图片下载框架,经常用到Synchronized同步,由于自己对同步有点模糊了,特此记录,方便下次查阅!

synchronized分为同步方法和同步代码块。

synchronized锁定的内容可以是具体的对象也可以是当前类的所有对象

synchronized可以有static变量锁和非static变量锁

1.同步方法

        /**
	 * 对象锁<同步方法>  锁定的对象是具体的类对象  多个线程可以访问不同该对象的方法  但是对于同一个对象一次只能访问一次
	 */
	public synchronized void m1() throws InterruptedException {
		Thread.sleep(2000);
		System.out.println("---person.m1---");
	}

当我们开启两个线程测试的时候,分别new出了Person p1,p2。当Thread1访问p1.m1()时,Thread2无法访问p1.m1(),但是Thread2可以访问p2.m1()。用法跟synchronized(this)是一样的效果。

2.用非static来当锁的时候

        /**
	 * 变量锁<同步块>  这种锁跟上方的对象锁是一个性质  不同线程可以访问不同变量 但是同一个对象一次只能访问一次
	 */
	Object a = new Object();// 变量锁
	public void m2() {
		synchronized (a) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("---线程访问了变量锁---");
		}
	}

当我们开启两个线程测试的时候,分别new出了Person p1,p2。当Thread1访问p1.m2()时,Thread2无法访问p1.m1(),但是Thread2可以访问p2.m2()。

3.用static变量 或者 xxx.class 作为锁的时候

<span style="white-space:pre">	</span>static Object b = new Object();// 静态变量锁
	public void m3() {
		synchronized (b) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("---线程访问了静态变量锁---");
		}
	}

这些情况下不乱你开了多少个线程同时访问多少类对象的对象m3只能一次一次的被调用,起到了全局锁的效果。

同步对代码整体的性能是有害无利的,当然我们有时候不得不这么做,当我们用到synchronized的时候切记用对方法才能起到对应的效果。<over!!>

时间: 2024-11-05 06:22:11

synchronized同步记录的相关文章

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

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

小凡的Linux主机与时间服务器同步记录

小凡的Linux主机与时间服务器同步记录 导读 我们新安装的Linux主机,如果没有做与互联网服务器时间同步的处理的话,当我们使用date命令的时候,我们就看不到当前的时间,只能看到过去的时间.在我们接下来的Linux学习过程中,经常需要利用到实时时间,所以与互联网时间同步,是我们安装Linux系统后迫切需要解决的问题.今天,小凡就手把手交你,如何通过定时任务,将你的Linux主机时间和互联网时间服务器同步! 1.了解定时任务工具crontab a.相关命令的介绍 crontab -u # 设定

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

Java synchronized同步 各方式略解

近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造).因为在构造Update语句时,需要递归去查询子节点以及构造全路径的值,需要花费了一定的时间,等批量执行update语句时,可能子节点的某个子节点的名称又改变了,会引起冲突,故用到了synchronized,顺便了解了下实现方式,原理没深入了解,在此记录以便日后查看. ------------------------