本文目录
- Java怎么使用synchronized声明一个变量
- java synchronized()括号中写什么内容,什么时候用synchronized
- synchronized什么意思
- synchronized方法使用
- 关于synchronized用法
- synchronized是什么方法干什么用的
- synchronized是什么意思
- java 中 synchronized 是什么意思
- java 问题,synchronized(),里面为什么要带参数怎么理解呢该怎么写
- synchronized
Java怎么使用synchronized声明一个变量
首先要说明的是,java里不能直接使用synchronized声明一个变量,而是使用synchronized去修饰一个代码块或一个方法。
详细说明如下:
synchronized用来修饰一个方法或者一个代码块,它用来保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用。
示例代码:
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i 《 5; i++) {
System.out.println(Thread.currentThread().getName() + “ synchronized loop “ + i);
}
}
}
public static void main(String args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, “A“);
Thread tb = new Thread(t1, “B“);
ta.start();
tb.start();
}
}
结果:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
java synchronized()括号中写什么内容,什么时候用synchronized
当需要线程同步时用。比如多个线程同时调用某个方法,就应该加上synchronized关键字。
至于synchronized(),括号里面是锁对象,线程要执行方法,就必须获得对象的锁(线程在执行时获得此对象的锁,别的线程就只能等了),这样通过加锁机制实现同步。
synchronized什么意思
synchronized
[英][’sɪŋkrənaɪzd][美][’sɪŋkrənaɪzd]
同步的;
例句:
1.
What do you mean by incorrectly synchronized?
没有正确同步的含义是什么?
2.
Head first, united states team members practiced a technical routine at the olympicgames synchronized swimming qualifications in london.
美国国家队成员正倒立水中,为伦敦奥运的花样游泳资格赛进行技术自选训练。
-chr
synchronized方法使用
你没有理解同步和异步。synchronized方法的目的就是防止多个线程同时访问导致出现脏数据等问题。所以如果一个线程去访问当然可以了,这和次数没关系。如果是多个线程访问,则一个线程访问完了才能有下一个线程去访问。
-c
关于synchronized用法
synchronized锁住的不是对象,是后面{}里的代码块,就是后面的代码块对不同的线程是互斥的
每个对象(注意是对象,不是类)都有一个监视器(monitor),只能有一个线程获得,synchronized(obj)就是获得obj的监视器,第一个线程获得了,其它线程再执行synchronized(obj)想获得obj的监视器就只能等待第一个线程把后面的代码块执行后释放obj的监视器
mt1.join的意思是要当前线程等待mt1执行完成后才能继续执行
StringBuffer.append的声明: public synchronized StringBuffer append(Object obj) ,它也是个同步方法,也需要获得当前对象的监视器
synchronized(sb) { //当前线程获得sb的监视器
mt1.join(); //当前线程等待mt1执行完
}
而mt1的run()方法里调用 sb.append,它需要获得sb的监视器,而它的监视器被主线程占用,只好等待主线程释放sb的监视器,所以主线程与mt1都在互相等待,只好死锁了
-chr
synchronized是什么方法干什么用的
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
对synchronized(this)的一些理解(很细致,感谢作者!)
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用
具体例子看:http://cyco00.blog.163.com/getBlog.do?bid=_fks_w_FIQ3sfjw_klZmhf8MtD2P07FAKA83I
-c
synchronized是什么意思
synchronized 英[’sɪŋkrənaɪzd] 美[’sɪŋkrənaɪzd]
[词典] 同步的;
[其他] 原型: synchronize
[例句]
Directory information is synchronized in one or both directories.
在一个或两个目录中同步目录信息。
2
Synchronized attribute can not be used with this method type.
不能与此方法类型一起使用同步属性。
3
The HACMP configuration for each cluster was also verified and synchronized prior to the upgrade.
还在升级之前检查和同步了每个集群的HACMP配置。
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。-chr
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。-c
java 中 synchronized 是什么意思
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。
关于线程的同步,一般有以下解决方法:
1. 在需要同步的方法的方法签名中加入synchronized关键字。
2. 使用synchronized块对需要进行同步的代码段进行同步。
3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象
-chr
java 问题,synchronized(),里面为什么要带参数怎么理解呢该怎么写
synchronized的参数代表的是“对象锁”。sychronized加锁的是对象,而不是代码。
我举了个例子:
public class Person
{
private String name; //意思差不多就是你那个obj
public setName(String name)
{
synchronized(name)
{
this.name = name;
}
}
}
代表的是不同的线程在synchronized块里,同时只有一个线程能执行该代码块,而类的不同实例之间是互不影响的。比如Person A = new Person(),Person B = new Person().A和B之间是不受synchronized制约的。
而:
public class Person()
{
private String name; //意思差不多就是你那个obj
public setName(String name)
{
synchronized(Person.class)
{
this.name = name;
}
}
}
“Person.class”这个锁对类级别的。不同的实例之间是同步的,也就是会所A和B必须同步访问synchronized代码块。
关于synchronized这块若要深入理解,需要对线程有个比较不多的掌握。
推荐楼主看看这个资料:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html
-c
synchronized
synchronized是解决多线程中同步问题的一个关键字。比如火车站卖票,如果不同步的话,很可能当一个窗口卖完了某一张票后,另一个窗口依然显示有那张票,但是取的时候就取不到了。加入synchronized后当一个窗口访问这张票的时候另一个窗口不能访问这张票。不知道这样解释你懂不懂?
下面是singleton:
public class Singleton {
private Singleton s;
private Singleton()
{
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
上面的程序就是一个单例模式,这个类的构造方法用private修饰了,所有在外边都不能调用,也就不能new Singleton();得到实例,那么
想得到实例就得调用它的静态方法getSigleton();即Singleton.getSigleton();就会返回一个Singleton的实例,注意此方法中的语句,即如果你是第一次调用这个方法那么它会给你new一个实例,以后再调用得到的都是这个实例,也就是说从始至终就只有一个Singleton的实例,这就是单例模式。
-chr