笔记01

Synchronized(this) 
锁住该代码块的对象,等访问该对象的线程执行完,其他线程才可以执行。
Synchronized(xxx.class) 
 锁住该类,所有访问该类的线程,一次只有一个可以执行。
其他
A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。 
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。 
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制


package kafka.producer

//kafka默认的分区 进行msg的keyhash分区
import kafka.utils._
import org.apache.kafka.common.utils.Utils

@deprecated("This class has been deprecated and will be removed in a future release. " +
            "It has been replaced by org.apache.kafka.clients.producer.internals.DefaultPartitioner.", "0.10.0.0")
class DefaultPartitioner(props: VerifiableProperties = null) extends Partitioner {
  private val random = new java.util.Random
  
  def partition(key: Any, numPartitions: Int): Int = {
    Utils.abs(key.hashCode) % numPartitions
  }
}











kafka的自定义分区
import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

public class KafkaPartitioner implements Partitioner{
	
	public KafkaPartitioner(VerifiableProperties properties) {
	}

	@Override
	public int partition(Object obj, int numPartitions) {
		int partition = 0;  
        if (obj instanceof String) {
            String key=(String)obj;  
            int offset = key.lastIndexOf('.');  
            if (offset > 0) {  
                partition = Integer.parseInt(key.substring(offset + 1)) % numPartitions;  
            }  
        }else{  
            partition = obj.toString().length() % numPartitions;  
        }  
        return partition;
	}
}

 

posted @ 2019-03-13 22:02  夜半钟声到客船  阅读(141)  评论(0编辑  收藏  举报