提到synchronized,大家应该都不陌生,有人问java怎么使用scanner,另外,还有朋友想问synchronize,这到底是咋回事?其实java的synchronized关键字呢,下面就由小编为大家介绍一下synchronized,希望对你有所帮助!
synchronized
看书的时候有一句话挺好的,我们应该解决错误而不是降低错误的发生概率。
虽然是几年前的问题,但是解答里面就一个说中了,其他都不知道在说些什么,或许是我段位太低了吧。
你sleep一下当前线程就会发现错误了。
while (ticket > 0) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName());
}
首先要说明的是,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()的参数有什么用,对这个参数本身会不会有什么影响
java中的对象锁,按照官方对线程所的解释,java中每个对象都有一个令牌,令牌有2种状态,当一个线程来访问资源时,会先检查这个令牌的状态。如果被占用则自己就处于等待状态。
synchronized(objA){
objB.method();
}
一般不建议这样使用,如果一个对象A被当成对象锁,资源时对象B;而对象B被当成资源A的对象锁,这样会造成死锁情况。
java 中 synchronized 是什么意思
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。
关于线程的同步,一般有以下解决方法:
1. 在需要同步的方法的方法签名中加入synchronized关键字。
2. 使用synchronized块对需要进行同步的代码段进行同步。
3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象
synchronized(lock)
synchronized有两种用法,一种是在方法定义时使用,多线程状态下,这个方法只能同时被同一个线程执行;另一种就是你问到的这种情况,用于锁定代码段,也就是说,{ }括号中的代码是不会同时被多个线程执行,而是排队执行。
以上是回答Java的synchronized关键字,C#里有lock对应,用来所著一个对象,其他线程只有等到被锁住的对象lockObj被释放以后,才可以执行括号中的内容。
Java中synchronized的作用,什么情况下使用?
synchronized是java中的一个关键字 我们称其为同步关键字 主要是用来处理java中的同步机制
同一个资源被用户并发访问时,会出现并发问题,比如:有一个实例变量x,第一个用户访问它,并赋值为100,但还没有来得及打印出x,另一个哥们进来访问了x,并改为200,这时候第一个哥们兴高采烈的打印出x的值,但却发现不是100,是200.这哥们就郁闷了,怎么回事呢?
这就是并发问题,但如果把上面的代码用同步代码块包含起来,任意一个时间只能有一个哥们访问实例变量x,一直到这哥们执行完同步代码块中的所有代码后,其他哥们才能再访问。
关于 Java synchronized(this) 的问题?
synchronized(this)
这里的this是指当前对象,也就是说不管ta还是tb,刚开始运行这段代码的时候会给这段代码加个锁,这样即使运行到中间被替换了,另一个线程也不会执行这段代码,因为这段代码加锁了,而钥匙在给代码加锁的那个线程手里,只有加锁的线程运行完这段代码,才会给代码解锁.然后其他线程才能执行这段代码..
加个synchronized(this)以后运行结果是这样:
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
不加的话是这样:(顺序乱了,有好多种结果,这里只是其中一种)..
A synchronized loop 0
B synchronized loop 0
A synchronized loop 1
B synchronized loop 1
A synchronized loop 2
B synchronized loop 2
A synchronized loop 3
B synchronized loop 3
B synchronized loop 4
A synchronized loop 4
Java的synchronized加在方法上或者对象上有什么区别
Java的synchronized加在方法上或者对象上区别如下:
1.synchronized 在方法上,所有这个类的加了 synchronized 的方法,在执行时,会获得一个该类的唯一的同步锁,当这个锁被占用时,其他的加了 synchronized 的方法就必须等待
2.加在对象上的话,就是以这个对象为锁,其他也以这个对象为锁的代码段,在这个锁被占用时,就必须等待
synchronized(this)跟synchronized(类的名.class)有什么不同之处
synchronized(this)是对象锁,如果有多个对象就有相对应的多个锁
synchronized(类的名.class)是全局锁,不管有几个对象就公用一把锁
求监督...
synchronized 怎么读
synchronized
英式读音:['sɪŋkrənaɪzd]
美式读音:['sɪŋkrənaɪzd]
中文谐音:丝莹克热奈字的
adj. 同步的;同步化的
v. 使协调(synchronize的过去分词);同时发生;校准
双语例句:
For example, you can delete them or request that they be synchronized.
例如,您可以将它们删除或者请求将它们同步。