synchronized

Which is the difference between AtomicReference and Synchronized?

柔情痞子 提交于 2019-12-21 03:56:18
问题 Is there any difference between AtomicReference and Synchronized? E.G. public class Internet { AtomicReference<String> address; public String getAddress(){ return address.toString(); } public void setAddress(String address) { this.address.set(address); } } And I pass the class to some threads that try to use the class at the same time, is it the same thing if I use this: public class Internet { String address; public String getAddress(){ return address; } public void setAddress(String address

java 多线程系列基础篇(一)

戏子无情 提交于 2019-12-21 01:04:19
多线程状态图: Thread类的两个方法比较: yield方法: Yield是一个静态的原生(native)方法 Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。 Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态 它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态 join方法: join()方法可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行。 在join(long millis)方法内设定超时,使得join()方法的影响在特定超时后无效。当超时时,主方法和任务线程申请运行的时候是平等的。然而,当涉及sleep时,join()方法依靠操作系统计时,所以你不应该假定join()方法将会等待你指定的时间。 说明 : 线程共包括以下5种状态。 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。 2. 就绪状态(Runnable) : 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。 3. 运行状态(Running) :

Java synchronized用法搜集

守給你的承諾、 提交于 2019-12-20 18:26:38
在Java中,synchronized关键字为防止资源冲突提供了支持,其作用域有二种: 实例范围。 对象实例范围内synchronized使用的两种形式: 实例范围同步方法 publicd class syncTest { … synchronized void aMethod() { // 需要同步使用的代码 } } synchronized aMethod(){}可以防止多个线程同时访问这个 对象实例 的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。 实例范围同步区块 publicd class syncTest { … void aMethod() { // 无需 同步使用的代码 … synchronized(this) { // 需要同步使用的代码 块 } } } 除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。 用法是: synchronized(this){/*区块*/}

Java笔记--多线程

安稳与你 提交于 2019-12-20 16:49:30
1、线程的创建与运行(方式一): --1)创建一个Thread的子类; --2)重写Thread类的run()方法; --3)创建一个子类的对象; --4)调用线程的start()方法来启动线程,Java虚拟机将调用run()方法。 public class TestThread { public static void main(String[] args) { // TODO Auto-generated method stub SubThread st = new SubThread(); st.start(); System.out.println("---MainThread---"); } } class SubThread extends Thread{ @Override public void run() { System.out.println("---SubThread---"); } } 2、Thread的常用方法: --1)start(); //启动线程 --2)run(); //子线程要执行的代码写在该方法中 --3)currentThread(); //静态方法,调取当前线程 --4)getName(); //获取当前线程名称 --5)setName(); //设置当前线程名称 --6)yield(); //释放当前CPU执行权 --7)join();

Sharing an object between two threads and main program

梦想与她 提交于 2019-12-20 12:32:24
问题 I am new to Java and I'm attending a Concurrent Programming course. I am desperately trying to get a minimal working example that can help to demonstrate concepts I have learnt like using 'synchronized' keyword and sharing an object across threads. Have been searching, but could not get a basic framework. Java programmers, kindly help. 回答1: Here is a very shot example of sharing an array between two threads. Usually you will see all zeros, but sometimes things get screwy and you see other

Mixing synchronized() with ReentrantLock.lock()

十年热恋 提交于 2019-12-20 11:59:05
问题 In Java, do ReentrantLock.lock() and ReetrantLock.unlock() use the same locking mechanism as synchronized() ? My guess is "No," but I'm hoping to be wrong. Example: Imagine that Thread 1 and Thread 2 both have access to: ReentrantLock lock = new ReentrantLock(); Thread 1 runs: synchronized (lock) { // blah } Thread 2 runs: lock.lock(); try { // blah } finally { lock.unlock(); } Assume Thread 1 reaches its part first, then Thread 2 before Thread 1 is finished: will Thread 2 wait for Thread 1

并发编程之多线程

故事扮演 提交于 2019-12-20 08:56:07
为什么有线程安全问题? 当多个线程同时共享,同一个 全局变量或静态变量 ,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 线程安全解决办法: 问:如何解决多线程之间线程安全问题 答:使用多线程之间同步synchronized或使用锁(lock)。 问:为什么使用线程同步或使用锁能解决线程安全问题呢? 答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。 问:什么是多线程之间同步 答:当多个线程共享同一个资源,不会受到其他线程的干扰。 内置的锁 Java提供了一种内置的锁机制来支持原子性 每一个Java对象都可以用作一个实现同步的锁,称为内置锁,线程进入同步代码块之前自动获取到锁,代码块执行完成正常退出或代码块中抛出异常退出时会释放掉锁 内置锁为互斥锁,即线程A获取到锁后,线程B阻塞直到线程A释放锁,线程B才能获取到同一个锁 内置锁使用synchronized关键字实现,synchronized关键字有两种用法: 1.修饰需要进行同步的方法(所有访问状态变量的方法都必须进行同步),此时充当锁的对象为调用同步方法的对象 2.同步代码块和直接使用synchronized修饰需要同步的方法是一样的,但是锁的粒度可以更细

Can a thread call wait() on two locks at once in Java (6)

筅森魡賤 提交于 2019-12-20 07:23:56
问题 I've just been messing around with threads in Java to get my head around them (it seems like the best way to do so) and now understand what's going on with synchronize, wait() and notify(). I'm curious about whether there's a way to wait() on two resources at once. I think the following won't quite do what I'm thinking of ( edit : note that the usual while loops have been left out of this example to focus just on freeing up two resources ): synchronized(token1) { synchronized(token2) { token1

认识Synchronize 关键字

家住魔仙堡 提交于 2019-12-20 07:18:27
1.synchronized 修饰方法,同一个对象实例只允许一个线程访问此方法。这是学synchronized 关键字时必须要知道的,那同一个对象实例,synchronized方法在被一个线程访问, 问题1:别的线程同时可以访问其他没有synchronized的方法吗?问题2:可以访问带有synchronized方法吗? 答案:答案1:可以,答案2 :不可以。 解释:当访问synchronized方法是,需要先获取对象锁,因为一个synchronized 方法正在访问,这时对象锁无法获取,所以其他带有synchronized 修饰的方法无法访问, 但是没有synchronized 修饰的方法不需要对象锁,所以可以访问。 光说不行啊,我们要用代码验证一下是吧,上代码: class SynchronizeTest1 { public long count1; public long count2; public long count3; public synchronized void printCount1(String threadName) { for (int j = 0; j < 1000; j++) { count1++; } try { Thread.sleep(1000l); } catch (InterruptedException e) { // TODO Auto

Java 线程控制

ぃ、小莉子 提交于 2019-12-20 07:15:32
一、线程控制   和线程相关的操作都定义在Thread类中,但在运行时可以获得线程执行环境的信息。比如查看可用的处理器数目(这也行?): public class RunTimeTest { public static void main(String[] args) { Runtime rt=Runtime.getRuntime(); System.out.println(rt.availableProcessors()); System.out.println(rt.totalMemory()); System.out.println(rt.freeMemory()); System.out.println(rt.maxMemory()); } }   以上程序的输出为: JVM可用的处理器数量:8 JVM的内存总量:128974848 JVM的可用(free)内存量:125561424 JVM将尝试使用的最大内存量:1890582528   线程还提供了一些方法用于对线程进行便捷的控制。   1、线程睡眠   静态方法Thread.sleep(long millis)强制正在执行的线程暂停进入睡眠状态,进入阻塞状态。睡眠结束后,线程转为就绪状态。 /*自定义的睡眠时间单位为毫秒*/ /*必须要进行异常处理*/ try { Thread.sleep(lengthOfPause)