一.Java的synchronized使用方法总结:
把synchronized当做函数修饰符时,示例代码如下:
public synchronized void method(){
//……
}
这也就是同步方法,那这时synchronied锁定的是哪个对象呢?他锁定的是调用这个同步方法对象,也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间也会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一个对象P2却能任意调用这个别加了synchronied关键字的方法。
以上代码等同于如下代码:
public void method(){
synchronized(this){
//……
}
}
this 指的是什么?他指的就是调用这个方法的对象.
二.举例:
1.public class synchro implements Runnable {
static int b = 100;
static synchro ss = new synchro();
static synchro ss1 = new synchro();
public synchronized void m1() throws Exception {
System.out.println("m111");
b--;
Thread.sleep(5000);
System.out.println("Thread=" + Thread.currentThread().getName() + " "
+ this + " " + "b=:" + b);
}
public void m2() throws Exception {
System.out.println("m2");
b--;
System.out.println("Thread=" + Thread.currentThread().getName() + " "
+ this + " " + b);
}
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
Thread tt = new Thread(ss);
Thread tt1 = new Thread(ss);
tt.start();
tt1.start();
ss.m2();
ss.m1();
}
}
// 相同对象中各线程之间同步(synchronized)方法与非同步方法之间不互斥。
// 一种执行结果:
m111
m2
Thread=main synchro@4a5ab2 98
Thread=Thread-0 synchro@4a5ab2 b=:98
m111
Thread=main synchro@4a5ab2 b=:97
m111
Thread=Thread-1 synchro@4a5ab2 b=:96
2.
public class CopyOfsynchro implements Runnable {
static int b = 100;
public synchronized void m1() throws Exception {
System.out.println("m1");
b--;
Thread.sleep(5000);
System.out.println("m1" + "Thread=" + Thread.currentThread().getName()
+ " " + this + " " + "b=:" + b);
}
public synchronized void m2() throws Exception {
System.out.println("m2");
b--;
Thread.sleep(1000);
System.out.println("m2" + "Thread=" + Thread.currentThread().getName()
+ " " + this + " " + b);
}
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
CopyOfsynchro ss = new CopyOfsynchro();
CopyOfsynchro ss1 = new CopyOfsynchro();
Thread tt = new Thread(ss);// ss,tt与tt1是同一对象的不同线程(ss.m2()显示的是主线程)
Thread tt1 = new Thread(ss);
Thread tt2 = new Thread(ss1);// tt2与tt,tt1是不同对象的不同线程
tt.start();
tt2.start();
ss.m2();
tt1.start();
}
}
// 相同对象中各线程之间互斥,不同对象中各线程之间不互斥
// 一种执行结果:
m1
m1
m1Thread=Thread-0 CopyOfsynchro@6e1408 b=:98
m2
m1Thread=Thread-2 CopyOfsynchro@e53108 b=:98
m2Thread=main CopyOfsynchro@6e1408 97
m1
m1Thread=Thread-1 CopyOfsynchro@6e1408 b=:96
分享到:
相关推荐
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
java的线程同步机制synchronized关键字的理解_.docx
Java多线程synchronized关键字详解(六)共5页.pdf.zip
Java 中多线程的同步依靠的是对象锁机制,synchronized关键字就是利用了封装对象锁来实现对共享资源的互斥访问。下面这篇文章主要介绍了java线程与synchronized关键字的相关资料,需要的朋友可以参考下。
线程安全,使用synchronized关键字
Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...
实例解析Java中的synchronized关键字与线程平安问题_.docx
java基本教程之synchronized关键字java多线程教程共19页.pdf.zip
java基础(5.8)java高级基础之线程——synchronized关键字 本章主要讲线程,至于带上进程的原因是为了方便大家对进程和线程有个概念(咳,主要原因是鄙人也不太会进程~)。 首先简单说下我个人对进程和线程的理解。...
【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx
主要介绍了Java 多线程synchronized关键字详解(六)的相关资料,需要的朋友可以参考下
主要为大家详细介绍了java多线程编程之Synchronized关键字,感兴趣的朋友可以参考一下
Java的synchronized关键字用于修饰线程同步,用以线程资源共享的目的等,下面就带来简单的Java多线程编程中synchronized关键字的基础用法讲解
synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。也就是说,在父类的方法声明上可以没有synchronized关键字,而在子类覆盖该方法时加上synchronized关键字。 注意:使用...
JAVA中要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,看下面的代码,只要在void和public之间加上synchronized关键字
synchronized关键字是Java提供的一种内建的同步机制,它可以确保同一时刻最多只有一个线程执行该段代码,从而保证线程安全。 volatile关键字 volatile关键字可以保证变量的可见性,当一个线程修改了volatile变量的值...
volatile 关键字是线程同步的轻量级实现,所以volatile 性能肯定比synchronized关键字要好。但是volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 volatile 关键字能保证数据的可见性,但...
开启了10个线程,每个线程都累加了10000000次,如果结果正确的话总数应该是10*10000000=1000000000.可是运行多次结果都不是这个数,而且每次运行结果都不一样。 线程安全问题主要来源于JMM的设计,主要集中在主内存...
现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test 的 synchronized 方法,此时线程 B 无法获得 Test 的同步锁,必须等待线程 A 释放 Test 的...