java中Synchronized锁的用法
java中Synchronized锁的⽤法
Java线程同步中的⼀个重要的概念synchronized.
synchronized是java的关键字,是⼀种同步锁,它作⽤的对象有以下⼏种:
①作⽤在代码块上.该代码块称为同步代码块,作⽤范围是⼤括号{..}括起来的代码,作⽤的对象是调⽤这个代码块的对象
②⽅法上
③静态⽅法
④类
案列1,同步代码块
```
public class MySynchornized implements Runnable {
private static int count;
public MySynchornized() {
count = 0;
}
@Override
public void run() {
// 同步代码块
synchronized (this) {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public int getCount() {
return count;
}
}调⽤
测试结果:
未加锁情况下:
加锁:
Java中this、super用法
1 / 5
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。
好了,现在开始讨论this&super这两个关键字的意义和用法。
在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。
在一般方法中
最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name);
//你可以加上this来调用方法,像这样:
this.setName(name);但这并不是必须的setAge(age);
2 / 5
this.print(); br> }
public void setName(String name){
java中Synchronized锁的用法
java中Synchronized锁的⽤法
Java线程同步中的⼀个重要的概念synchronized.
synchronized是java的关键字,是⼀种同步锁,它作⽤的对象有以下⼏种:
①作⽤在代码块上.该代码块称为同步代码块,作⽤范围是⼤括号{..}括起来的代码,作⽤的对象是调⽤这个代码块的对象
②⽅法上
③静态⽅法
④类
案列1,同步代码块
```
public class MySynchornized implements Runnable {
private static int count;
public MySynchornized() {
count = 0;
}
@Override
public void run() {
// 同步代码块
synchronized (this) {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public int getCount() {
return count;
}
}调⽤
测试结果:
未加锁情况下:
加锁:
Java中finalize()的另类用法
做过JAVA编程的都知道,在JAVA中有一种垃圾收集器的机制,当它运行时(通常在系统内存低到一定限度时自动运行),会回收不再使用的对象所占用的内存,所以,在JAVA程序中,我们通常只考虑创建对象,而从不关心对象的清除。Finalize()是JAVA为类提供的一种特殊方法。垃圾收集器的工作过程大致是这样的:一旦垃圾收集器准备好释放无用对象占用的存储空间,它首先调用那些对象的finalize()方法,然后才真正回收对象的内存。通过使用finalize(),就可以在垃圾收集器运行期间进行一些特殊的工作。下面一例就说明了finalize()的一种巧妙用法。
现在的商业应用系统越来越多的采用WEB形式。在WEB形式应用中,每一次页面访问是独立的,前后不相关联,哪怕多个用户在同一时刻访问应用的同一个页面,用户相互之间也是不知道的。如果想要检查当前有哪些用户正在使用系统(如准备恢复数据备份或进行系统升级时,系统管理员都很希望知道这些信息),该怎么办呢? 基于Servlet、Jsp技术的WEB服务器提供了隐含的Session、Application对象,利用它可以帮开发者实现一些信息的持续保存和共享。当用户访问一个WEB应用时,WEB服务器会自动创建一个Session对象,该对象可以供用户在会话期内在应用的所有页面中共享数据; Application是WEB应用的一个全局对象。利用Session、Application对象,可以达到跟踪所有用户信息的目的。
当用户打开浏览器开始请求WEB应用的登录页面时,WEB服务即为该客户创建一个session,此后,在session的timeout时间内,该客户都使用这个session(timeout时间可设置,如Tomcat服务器是在各应用的web.xml文件中设置)。如果使用IE浏览器,Session与客户IP地址、客户程序进程ID所共同标识的连接有对应关系,相同IP地址、相同进程的窗口(如通过IE-文件-新建-窗口 打开的新窗口)具有同一个session,所以session可用于标识各个独立的客户应用连接。
Java中this、super用法 2
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。
好了,现在开始讨论this&super这两个关键字的意义和用法。
在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。
在一般方法中
最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name);
//你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
setAge(age);
this.print(); br> }
public void setName(String name){
java里面synchronized用法
java里面synchronized用法
在java编程思想中对synchronized的一点解释:
1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是:
synchronized(this){/*区块*/},它的作用域是当前对象;
3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){}
在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
----------------------------------------------------------------------------
java里面synchronized用法
synchronized的一个简单例子
public class TextThread
{
/**
Java中synchronized详解
Java中synchronized详解
synchronized官⽅解释
翻译成中⽂:
Synchronized同步⽅法可以⽀持使⽤⼀种简单的策略来防⽌线程⼲扰和内存⼀致性错误:如果⼀个对象对多个线程可见,则对该对
象变量的所有读取或写⼊都是通过同步⽅法完成的。
简单就是说Synchronized的作⽤就是Java中解决并发问题的⼀种最常⽤最简单的⽅法 ,他可以确保同⼀个时刻最多只有⼀个线程执
⾏同步代码,从⽽保证多线程环境下并发安全的效果。 如果有⼀段代码被Synchronized所修饰,那么这段代码就会以原⼦的⽅式执⾏,当
多个线程在执⾏这段代码的时候,它们是互斥的,不会相互⼲扰,不会同时执⾏。
Synchronized⼯作机制是在多线程环境中使⽤⼀把锁,在第⼀个线程去执⾏的时候去获取这把锁才能执⾏,⼀旦获取就独占这把锁
直到执⾏完毕或者在⼀定条件下才会去释放这把锁,在这把锁释放之前其他的线程只能阻塞等待。
synchronized是Java中的关键字,被Java原⽣⽀持,是⼀种最基本的同步锁。
它修饰的对象有以下⼏种:
1. 修饰⼀个代码块,被修饰的代码块称为同步语句块,其作⽤的范围是⼤括号{}括起来的代码,作⽤的对象是调⽤这个代码块的对象。
2. 修饰⼀个⽅法,被修饰的⽅法称为同步⽅法,其作⽤的范围是整个⽅法,作⽤的对象是调⽤这个⽅法的对象。
3. 修改⼀个静态的⽅法,其作⽤的范围是整个静态⽅法,作⽤的对象是这个类的所有对象。
4. 修改⼀个类,其作⽤的范围是synchronized后⾯括号括起来的部分,作⽤主的对象是这个类的所有对象。
不使⽤并发⼿段会有什么后果
两个线程同时i++,最后结果⽐预计的要少。
下⾯是测试代码
public class sync1 implements Runnable{
static sync1 instance = new sync1();
static int i = 0;
基于Java synchronized同步锁实现线程交互
龙源期刊网
基于Java synchronized同步锁实现线程交互
作者:崔政 段利国
来源:《软件工程》2018年第02期
摘 要:Java多线程能够提高CPU利用效率,但也容易造成线程不安全、线程死锁等问题。本文详细介绍了Java线程各状态之间的关系及其切换,并用实例展示了使用同步锁synchronized保证同一时刻只有一个线程操作同一资源,使用wait()、notify()切换线程状态保证线程操作的前后顺序实现线程交互。理解Java线程各状态之间的关系及其切换,能帮助用户在使用Java多线程的场景有效避免多线程带来的不安全问题。
关键词:多线程;synchronized;线程交互
中图分类号:TP312 文献标识码:A
Abstract:Java multi-threading can improve CPU utilization,but it can also cause problems
such as thread insecurity and thread deadlock.This paper introduces in detail the relationship between
Java thread states and their transitions.Java synchronized ensures that only one thread operates the
same resource at the same time,using wait() and notify() to switch the thread state to ensure
that thread interactions are implemented in the context of thread operations.Understanding the
java中this的用法
java中的this随处可见,用法也多,现在整理有几点:
1. this是指当前对象自己。
当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。如下面这个例子中:
public class Hello {
String s = "Hello";
public Hello(String s)
{
System.out.println("s = " + s);
System.out.println("1 -> this.s = " + this.s);
this.s = s;
System.out.println("2 -> this.s = " + this.s);
}
public static void main(String[] args) {
Hello x="new" Hello("HelloWorld!");
}
}
运行结果:
s = HelloWorld!
1 -> this.s = Hello
2 -> this.s = HelloWorld!
在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果; 第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!
2. 把this作为参数传递
当你要把自己作为参数传递给别的对象时,也可以用this。如:
public class A {
public A() { new B(this).print();
}
public void print() {
System.out.println("Hello from A!");
}
}
public class B {
java中synchronized关键字的用法
java中synchronized关键字的⽤法
在java编程中,经常需要⽤到同步,⽽⽤得最多的也许是synchronized关键字了,下⾯看看这个关键字的⽤法。
因为synchronized关键字涉及到锁的概念,所以先来了解⼀些相关的锁知识。
java的内置锁:每个java对象都可以⽤做⼀个实现同步的锁,这些锁成为内置锁。线程进⼊同步代码块或⽅法的时候会⾃动获得该锁,在退出同步代码块或⽅法时会释放该锁。获得
java内置锁是⼀个互斥锁,这就是意味着最多只有⼀个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程
java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是⼀致的,但是,两个锁实际是有很⼤的区别的,对象锁是⽤于对象实例⽅法,或者⼀个对象实例上的,类
上⾯已经对锁的⼀些概念有了⼀点了解,下⾯探讨synchronized关键字的⽤法。
synchronized的⽤法:synchronized修饰⽅法和synchronized修饰代码块。
下⾯分别分析这两种⽤法在对象锁和类锁上的效果。
对象锁的synchronized修饰⽅法和代码块:
public class TestSynchronized
{
public void test1()
{
synchronized(this)
{
int i = 5;
while( i-- > 0)
{
System.out.println(Thread.currentThread().getName() + " : " + i);
try
{
Thread.sleep(500);
}
catch (InterruptedException ie)
{
}
}
}
}
public synchronized void test2()
{
int i = 5;
java并发之线程同步(synchronized和锁机制)
java并发之线程同步(synchronized和锁机制)
多个执⾏线程共享⼀个资源的情景,是并发编程中最常见的情景之⼀。多个线程读或者写相同的数据等情况时可能会导致数据不⼀致。为了解决这些
问题,引⼊了临界区概念。临界区是⼀个⽤以访问共享资源的代码块,这个代码块在同⼀时间内只允许⼀个线程执⾏。
Java提供了同步机制。当⼀个线程试图访问⼀个临界区时,它将使⽤⼀种同步机制来查看是不是已有其他线程进⼊临界区。如果没有其他线程进⼊临
界区,它就可以进⼊临界区;如果已有线程进⼊了临界区,它就被同步机制挂起,直到进⼊的线程离开这个临界区。如果在等待进⼊临界区的线程不
⽌⼀个,JVM会随机选择其中的⼀个,其余的将继续等待。
概念⽐较好理解,具体在java程序中是如何体现的呢?临界区对应的代码是怎么样的?
使⽤synchronized实现同步⽅法
每⼀个⽤synchronized关键字声明的⽅法都是临界区。在Java中,同⼀个对象的临界区,在同⼀时间只有⼀个允许被访问。
注意:⽤synchronized关键字声明的静态⽅法,同时只能被⼀个执⾏线程访问,但是其他线程可以访问这个对象的⾮静态⽅法。即:两个线程可以同
时访问⼀个对象的两个不同的synchronized⽅法,其中⼀个是静态⽅法,⼀个是⾮静态⽅法。
知道了synchronized关键字的作⽤,再来看⼀下synchronized关键字的使⽤⽅式。
在⽅法声明中加⼊synchronized关键字
1 public synchronized void addAmount(double amount) {
2 }
在代码块中使⽤synchronized关键字,obj⼀般可以使⽤this关键字表⽰本类对象
1 synchronized(obj){
2 }
需要注意的是:前⾯已经提到,引⼊synchronized关键字是为了声明临界区,解决在多线程环境下共享变量的数据更改安全问题。那么,⼀般⽤到synchronized关键字的地⽅也就是 在对共享数据 访问或者修改的地⽅。下⾯举⼀个例⼦,例⼦场景是这样:公司定时会给账户打款,银⾏对账户进
